MongoDb 在嵌入式文档中插入或添加

MongoDb insert or add in embedded document

这是我的最终文档结构。我在 mongo 3.0

   {
     _id: "1",
     stockA: [ { size: "S", qty: 25 }, { size: "M", qty: 50 } ],
     stockB: [ { size: "S", qty: 27 }, { size: "M", qty: 58 } ]
   }

我在 stockAstockB 集合中随机添加元素。 我想提出一个满足以下规则的查询:

  1. 如果 item 不存在 - 创建整个文档并在 stock A or B 集合中插入项目。
  2. 如果 item 存在但缺少 stock A or B 集合,请创建 stock 集合并在集合中添加 element
  3. 如果 item 存在且 stock 集合存在,只需将 element 添加到集合中。

问题:是否可以在一个查询中实现所有这些?我的主要要求是当前插入必须非常快且可扩展。

如果,请你帮我提出所需的查询。

如果,能否请您指导我如何以最快、最干净的方式达到要求。

感谢您的帮助!

您可以使用带有 upsert 选项的 update 方法,这将在没有文档匹配查询条件时创建一个新文档。

db.collection.update({ "_id": 1 },
    {
        "$push" : {
            "stockB" : {
                           "size" : "M",
                           "qty" : 51
            },
           "stockA" : {
                           "size" : "M",
                           "qty" : 21
            }
        }
    }, 
    { "upsert": true }
)

您要找的接线员是$addToSet or $push in combination with upsert:true

两个运算符都可以接受多个 key/value 对。然后它将分别对每个键进行操作。两者都将在数组尚不存在时创建数组,并且在任何一种情况下都会添加值。

区别在于$addToSet会先检查数组中是否已经存在相同的元素。当性能成为问题时,请记住 MongoDB 必须执行线性搜索才能执行此操作。所以对于非常大的数组,$addToSet 会变得很慢。

更新功能的 upsert:true 选项将导致在找不到文档时创建文档。