我有一个看起来像这样的文件
{
_id:1,
list_id:23,
name:'list01'
cards:[
{
id:3,
name:'card01'
categories:[{
id:10,
category:'section01',
tags:[{id:11,name:'tag01',is_selected: true}]
}]
}
]
}
对于给定的 list_id ,我需要在选定的类别的标签数组中插入/推送一些数据,但是出现错误说
MongoError:在路径中找到太多位置(即“ $”)元素 'cards。$。categories。$。tags'
这是我尝试过的查询。这个查询有什么问题怎么实现呢?
db.collection(TABLE)
.updateOne(
{ list_id: 23, 'cards.categories.category': 'section01'},
{ $push: { 'cards.$.categories.$.tags': { name: 'tag02', id: uuidv4(), is_selected: true } } }
);
答案 0 :(得分:1)
简而言之,这是不可能的。
嵌套数组
位置$运算符不能用于遍历的查询 一个以上的数组,例如遍历嵌套数组的查询 在其他数组中,因为$占位符的替换是 一个值
https://docs.mongodb.com/manual/reference/operator/update/positional/
但是,您可能要尝试$ []
嵌套数组过滤后的位置运算符$ []可以是 用于遍历多个数组和嵌套数组的查询。
例如,请参阅使用$ []联合更新嵌套数组。
答案 1 :(得分:1)
您可以使用$[identifier]
db.collection.update({
"list_id": 23,
"cards.categories.category": "section01"
},
{
$push: {
"cards.$.categories.$[elem].tags": {
name: "tag02",
id: uuidv4(),
is_selected: true
}
}
},
{
arrayFilters: [
{
"elem.category": "section01"
}
],
multi: true
})
尝试here
答案 2 :(得分:1)
您不能使用多个$位置,对于您的情况,可以使用单个位置和arrayFilters,
过滤后的位置运算符$[<identifier>]
标识与arrayFilters条件匹配的数组元素以进行更新操作,
db.collection(TABLE).updateOne({
list_id: 23,
"cards.categories.category": "section01"
},
{
$push: {
"cards.$.categories.$[elem].tags": {
name: "tag02",
id: uuidv4(),
is_selected: true
}
}
},
{
arrayFilters: [
{ "elem.category": "section01" }
]
})