【问题标题】:Does Google Cloud Datastore support partial update like Mongodb $set?Google Cloud Datastore 是否支持像 Mongodb $set 这样的部分更新?
【发布时间】:2016-03-09 06:43:46
【问题描述】:
我正在使用 Node.js,并且不想每次更新都覆盖整个实体,并且大多数时候只需要更新特定属性,例如计数器。
文档中没有关于如何执行此操作的明显参考。
Node.js 版本的 Google Cloud Datastore 是否支持像 Mongodb $set 这样的部分更新?
【问题讨论】:
标签:
node.js
google-app-engine
google-cloud-datastore
【解决方案1】:
没有直接的 API 可以只更新实体的一个属性。
但是,您可以使用Datastore transactions,而不是获取、修改和更改实体(使用两个不同的数据存储 API 调用)。这是以原子方式实现此目的的推荐方法。
事务是对一个或多个实体的一组 Google Cloud Datastore 操作。每个事务都保证是原子的,这意味着事务永远不会部分应用。要么应用事务中的所有操作,要么不应用任何操作。
example in the documentation 正在解释如何使用事务来“使用相对于当前值的新属性值更新实体:。这正是您要寻找的。p>
【解决方案2】:
除了 put() 和 putmulti() 之外,没有用于更新实体的 DataStore API,所以这几乎是不可能的。
阅读from here 会告诉你原因。
在内部,App Engine 将实体存储在协议缓冲区中,这是序列化结构化数据的有效机制;有关更多详细信息,请参阅开源项目页面。不是将每个实体属性存储为相应 Bigtable 行中的单独列,而是使用单个列,其中包含二进制编码的协议缓冲区,其中包含给定实体的每个属性的名称和值。
简而言之,Datastore 中的实体行是底层存储方案中的单个二进制值,这就是为什么没有用于部分更新的 API。