【问题标题】:Google Cloud Datastore Update Entity: Node.js ClientGoogle Cloud Datastore 更新实体:Node.js 客户端
【发布时间】:2018-07-27 20:40:15
【问题描述】:

如何在 nodejs 中更新 GCP 数据存储实体。

// Saves the entity
datastore
.save(task)
.then(() => {
  console.log(`Saved ${task.key.name}: ${task.data.description}`);
})
.catch(err => {
 console.error('ERROR:', err);
});

通常保存功能是存储数据,如果我们发送现有的数据,它会很好地更新。但是,如果我们错过了一些列,那么它将使这些列无效。是否有任何功能可以更新数据存储中的实体。

【问题讨论】:

    标签: node.js database google-cloud-platform google-cloud-datastore


    【解决方案1】:

    https://cloud.google.com/nodejs/docs/reference/datastore/1.3.x/Datastore阅读“保存”文档 -

    默认情况下,所有属性都被索引。要防止某个属性包含在所有索引中,您必须提供 excludeFromIndexes 数组。

    我假设您得到空字段,因为它们已编入索引。尝试从可能不存在的字段中删除索引。

    【讨论】:

    【解决方案2】:

    数据存储区中的save() 会覆盖实体。如果你想做一个 更新:

    1. 获取实体。
    2. 更新实体中的相关字段。
    3. 使用save()进行更新。

    为了避免竞争条件,可以使用数据存储transaction

    【讨论】:

    • 我现在正在使用这种方法。
    【解决方案3】:

    我的理解是,如果您只在更新中提供 6/8 个属性,为什么用 8 个有效属性更新实体会导致 2 个属性无效。

    这是设计使然,Datastore 将使用save() 写入整个实体。你要做的是强制save(method=upsert, yourdata),一个捷径是使用upsert()方法。

    【讨论】:

    • 仍然以空数据结束。
    • var JSONObject = { "Device_Key": 123, "DeviceName": "abc" } var key = datastore.key([DB_CONFIG.DBNAME, ("Device_Key", JSONObject.Device_Key)]); datastore.save({ key: key, data: JSONObject }, function(err) { if (err) { LOGGER.debug("数据输入失败:" + err); callback(err) } else { callback({ "code ": "200" }) } })
    • 但是您还没有在此处明确设置方法,为upsert。你让图书馆推断它。一个捷径是直接使用upsert() 方法,这是save() 强制使用method='upsert'cloud.google.com/nodejs/docs/reference/datastore/1.4.x/….
    【解决方案4】:

    如果您使用 gstore-node,模型上有一个 update() 方法可以为您执行此操作。
    gstore 会做(在事务中):

    • 获取数据存储区中的实体
    • 将您传递的数据与获取的实体合并
    • 将实体保存回数据存储区。

    这是关于模型的 update() 的文档:https://sebelga.gitbooks.io/gstore-node/content/model/update-method.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-13
      • 2021-04-05
      • 1970-01-01
      • 2019-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多