这是我的最终文档结构。我在 mongo 3.0 。
{
_id: "1",
stockA: [ { size: "S", qty: 25 }, { size: "M", qty: 50 } ],
stockB: [ { size: "S", qty: 27 }, { size: "M", qty: 58 } ]
}
我在stockA
或stockB
个集合中随机添加元素。
我想提出一个符合以下规则的查询:
item
不存在 - 创建整个文档并在stock A or B
集合中插入项目。 item
存在,但缺少stock A or B
集合,请创建stock
集合并在集合中添加element
。 item
且存在stock
集合,则只需将element
附加到集合中。 问题:是否可以在一个查询中实现所有这些功能?我的主要要求是当前的插件必须非常快速和可扩展。
如果是,请您帮我提出所需的查询。
如果没有,请您指导我如何以最快和最干净的方式达到要求。
感谢您的帮助!
答案 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
或$push
与upsert:true
的结合。
两个运营商都可以采用多个键/值对。然后它将在每个键上单独操作。两者都会在尚未存在的情况下创建数组,并且在任何一种情况下都会添加该值。
不同之处在于$ addToSet将首先检查数组中是否已存在相同的元素。当性能成为问题时,请记住MongoDB必须执行线性搜索才能执行此操作。因此,对于非常大的数组,$ addToSet可能变得非常慢。
更新功能的upsert:true
选项将导致在找不到文档时创建文档。