MongoDb插入或添加嵌入文档

时间:2015-03-24 11:51:45

标签: mongodb mongodb-query

这是我的最终文档结构。我在 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附加到集合中。
  4. 问题:是否可以在一个查询中实现所有这些功能?我的主要要求是当前的插件必须非常快速和可扩展。

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

    如果没有,请您指导我如何以最快和最干净的方式达到要求。

    感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

您可以将update方法与upsert选项一起使用,当没有文档符合查询条件时,该选项将创建新文档。

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

答案 1 :(得分:1)

您正在寻找的运营商是$addToSet$pushupsert:true的结合。

两个运营商都可以采用多个键/值对。然后它将在每个键上单独操作。两者都会在尚未存在的情况下创建数组,并且在任何一种情况下都会添加该值。

不同之处在于$ addToSet将首先检查数组中是否已存在相同的元素。当性能成为问题时,请记住MongoDB必须执行线性搜索才能执行此操作。因此,对于非常大的数组,$ addToSet可能变得非常慢。

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