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