MongoDB 3.6允许对任何数组中的所有匹配元素执行复杂的数组操作 - 无论嵌套有多深 - Update Nested Arrays with $[identifier]
请考虑以下survey
集合中的文档:
{
"_id": "5a7d86d8fac139e71b0b9f5b",
"results": [
{
"items": [
{
"comments": [
{
"id" : "123456",
"email": "user@email.com",
"content": "comment 1",
"createdAt": "2018-05-03"
"replies": []
}
]
}
]
}
]
}
我正在尝试更新评论email
,content
和createdAt
字段,而不会触及id
和replies
字段。
我正在使用$set
和新的$[<identifier>]
我根据The update command 尝试了下面的command
:
db.runCommand({
update: "survey",
updates: [
{
q: {},
u: {
$set: {
"results.$[].items.$[].comments.$[comment]": {
"email": "user2@email.com",
"content": "comment 2",
"createdAt": "2018-05-04"
}
}
},
arrayFilters: [
{
"comment.id": {
$eq: "123456"
}
}
]
}
]
})
该命令有效但删除了id
和replies
字段。
有任何帮助吗?感谢。
答案 0 :(得分:1)
$set
的 {}
会覆盖匹配的文档。使用$set
并使用点表示法列出所有文档字段以执行字段级更新。更多here
。
db.runCommand({
update: "survey",
updates: [
{
q: {},
u: {
$set: {
"results.$[].items.$[].comments.$[comment].email": "user2@email.com",
"results.$[].items.$[].comments.$[comment].content": "comment 2",
"results.$[].items.$[].comments.$[comment].createdAt": "2018-05-04"
}
},
arrayFilters: [
{
"comment.id": {
$eq: "123456"
}
}
]
}
]
})