我有一个像这样的mongo文件。
{ "_id" : ObjectId("50b429ba0e27b508d854483e"), "array" : [ { "id" : "1", "letter" : "a" }, { "id" : "2", "letter" : "b" } ], "tester" : "tom" }
我希望能够插入和更新array与单个蒙戈命令内不使用条件find(),然后运行insert(),并update()根据对象的存在。
array
find()
insert()
update()
这id是我要成为选择器的项目。所以如果我用这个更新数组:
id
{ "id" : "2", "letter" : "c" }
我必须使用一个$set声明
$set
db.soup.update({ "tester":"tom", 'array.id': '2' }, { $set: { 'array.$.letter': 'c' } })
如果我想在数组中插入一个新对象
{ "id" : "3", "letter" : "d" }
我必须使用一个$push声明
$push
db.soup.update({ "tester":"tom" }, { $push: { 'array': { "id": "3", "letter": "d" } } })
我需要一种用于数组项的upsert。
我必须以编程方式执行此操作还是可以通过一个mongo调用来执行此操作?
我不知道在MongoDB 2.2上会向上插入嵌入式阵列的选项,因此您可能必须在应用程序代码中进行处理。
鉴于您希望将嵌入式数组视为虚拟集合,因此您可能需要考虑将数组建模为单独的集合。
您不能基于嵌入式数组中的字段值进行upsert,但是$addToSet如果尚不存在嵌入式文档,则可以使用它来插入:
$addToSet
db.soup.update({ "tester":"tom" }, { $addToSet: { 'array': { "id": "3", "letter": "d" } } })
这不适合您使用idarray元素匹配的确切用例,但是如果您知道期望的当前值,则可能会有用。