MongoDB 数组 - 原子更新或推送元素

Rav*_*gal 5 arrays mongodb

我在 MongoDB 中有以下文档。

{
    "_id" : ObjectId("521aff65e4b06121b688fabc"),
    "user" : "abc",
    "servers" : [
        {
            "name" : "server1",
            "cpu" : 4,
            "memory" : 4
        },
        {
            "name" : "server2",
            "cpu" : 6,
            "memory" : 6
        },
        {
            "name" : "server3",
            "cpu" : 8,
            "memory" : 8
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

根据某些事件,我必须更新现有服务器的 cpu 和内存字段,或者如果阵列中不存在新服务器,则将其添加到阵列中。目前,我分两步执行此操作。首先检查服务器是否已经存在于数组中。如果是,则更新 cpu 和内存字段。否则,将新的子文档推送到数组中。由于应用程序的多线程性质,有时同一服务器会多次添加到数组中。是否有原子操作符可以执行以下两个操作(类似于$setOnInsert操作符):

  1. 如果数组中存在元素,则更新其字段。
  2. 如果数组中不存在元素,则推送新元素。

注意:$addToSet在上述情况下,运算符不起作用,因为 cpu 或内存的值可能不同。

Dav*_*ica 0

MongoDb 已经对单个文档进行了原子操作。因此,只要同时向数据库发送 2 个命令,您就可以开箱即用。

当这两个命令无论如何都是矛盾的时候,你的问题就会出现。IE 如果您使用同一对象发送 2 个更新,Mongo 的个人文档气氛不会为您提供帮助。因此,您需要做的是管理应用程序的多线程,以便它不会向 Mongo 发送可能发生冲突的多个命令。

  • 如果您有多实例部署(这是常见情况),这并不能解决问题。 (2认同)