给定此文档:
{
"_id": 0,
"name": "Usman Shehu",
"dp": "ol.jpg",
"contacts": [
{
"id": 0,
"name": "Ahmad Sani",
"dp": "ol.jpg",
"m": "Messages:12",
"time": "01:27am",
"chats": [
{
"msg": "hello there",
"t": "12:45am",
"des": "from"
},
{
"msg": "how far...",
"t": "12:47am",
"des": "to"
},
{
"msg": "so far so good",
"t": "01:05pm",
"des": "from"
}
]
}
]
}
如果我尝试运行此查询...
db.gist.update({"contacts.id":0},{$push:{chats:{"msg":"Test4","des":"from","t":"06:38pm"}}})
。它不是更新"聊天"数组,而是将其添加为文档中的新字段。
请帮忙吗?
这将起作用:
db.gist.update({"contacts.id":0},{$push:{"contacts.$.chats":{"msg":"Test4","des":"from","t":"06:38pm"}}})
您必须为 $push
命令指定contacts.$.chat
,因为contacts.chat
是一个嵌套数组,您必须使用 position 运算符。
针对问题中提供的文档运行上述命令会生成以下更新的文档:
{
"_id" : 0,
"name" : "Usman Shehu",
"dp" : "ol.jpg",
"contacts" : [
{
"id" : 0,
"name" : "Ahmad Sani",
"dp" : "ol.jpg",
"m" : "Messages:12",
"time" : "01:27am",
"chats" : [
{
"msg" : "hello there",
"t" : "12:45am",
"des" : "from"
},
{
"msg" : "how far...",
"t" : "12:47am",
"des" : "to"
},
{
"msg" : "so far so good",
"t" : "01:05pm",
"des" : "from"
},
{
"msg" : "Test4",
"des" : "from",
"t" : "06:38pm"
}
]
}
]
}
注意:文档指出:
位置 $ 运算符充当更新查询文档的第一个匹配项的占位符。
您的更新查询文档 ( {"contacts.id":0}
( 使用一个id
,这表明只有一个预期的匹配项,因此使用位置运算符应该适合您的用例。但是,值得注意的是,如果更新查询文档与多个联系人匹配,则只会更新第一个匹配的联系人。