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 } ]
}
我在 stockA
或 stockB
集合中随机添加元素。
我想提出一个满足以下规则的查询:
- 如果
item
不存在 - 创建整个文档并在 stock A or B
集合中插入项目。
- 如果
item
存在但缺少 stock A or B
集合,请创建 stock
集合并在集合中添加 element
。
- 如果
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
选项将导致在找不到文档时创建文档。
这是我的最终文档结构。我在 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
添加到集合中。
问题:是否可以在一个查询中实现所有这些?我的主要要求是当前插入必须非常快且可扩展。
如果是,请你帮我提出所需的查询。
如果否,能否请您指导我如何以最快、最干净的方式达到要求。
感谢您的帮助!
您可以使用带有 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
选项将导致在找不到文档时创建文档。