我的文档结构如下:
{
"name":"CategoryChildLevel2",
"parentId":"2",
"otherAttribute":"anyVal",
"breadcrumb":[
{
"name":"RootCategory",
"id":"1"
},
{
"name":"CategoryChildLevel1",
"id":"2"
},
{
"name":"CategoryChildLevel2",
"id":"3"
}
]
}
我想要的是能够运行一个说:
的查询替换以
开头的面包屑数组 {
"name":"RootCategory",
"id":"1"
},
{
"name":"CategoryChildLevel1",
"id":"2"
}
用
替换此子序列 {
"name":"RootCategory",
"id":"1"
},
{
"name":"AnotherCategory",
"id":"4"
}
{
"name":"AnotherCategory2",
"id":"5"
}
以便最终结果是
{
"name":"CategoryChildLevel2",
"parentId":"2",
"otherAttribute":"anyVal",
"breadcrumb":[
{
"name":"RootCategory",
"id":"1"
},
{
"name":"AnotherCategory",
"id":"4"
},
{
"name":"AnotherCategory2",
"id":"5"
},
{
"name":"CategoryChildLevel2",
"id":"3"
}
]
}
我们可以在MongoDB中执行此操作吗?或者至少检索我们应该更新的项目(array startsWith
查询),使用正常的查询语言或map / reduce?
答案 0 :(得分:1)
从Mongo 2.2开始,您可以在更新的查询选择器中使用数组dot notation来执行此操作:
db.test.update({
'breadcrumb.0.id': '1',
'breadcrumb.1.id': '2'
}, {
$set: {
'breadcrumb.1': {
name: "AnotherCategory",
id: "4"
}
}
}, {multi: true})
在以前的版本中,您必须使用update
中的$where
查询选择器执行此操作,如下所示:
db.test.update({
'breadcrumb.id': '2',
// Check the name fields as well here, if necessary.
$where: "this.breadcrumb.length > 1 && this.breadcrumb[0].id === '1' && this.breadcrumb[1].id === '2'"
}, {
$set: {
'breadcrumb.1': {
name: "AnotherCategory",
id: "4"
}
}
}, { multi: true})
查询的'breadcrumb.id': '2'
组件有助于提升效果,因为它会限制慢$where
必须操作的文档数量。