我有以下文件:
{
"_id" : ObjectId("5720bd01232ac527623f2889"),
"planes" : [
{
"name" : "plane1",
"wings" : [
{
"name" : "rightDown"
},
{
"name" : "rightUp"
}
]
},
{
"name" : "plane2",
"wings" : [
{
"name" : "leftUp",
},
{
"name" : "leftDown",
}
]
}
]
}
我想更新嵌套在另一个数组中的数组中的对象,而不使用数组索引。 在我的例子中,'plane2'的属性'wing'名为'leftDown'。可能吗 ?
db.planes.update({
planes: {
$elemMatch: {
wings: {
$elemMatch: {
name: 'leftUp'
}
}
}
}
},
// It would be wonderful if I the $set would look like this,
// but the error is:
// "Too many positional (i.e. '$') elements found in path 'planes.$.wings.$'"
//
// It seems that $ holds only the value of the first nested
// object in the array
{
$set: {
'planes.$.wings.$': {
name: 'leftMagic'
}
}
})
MongoDb 3.2文档说: 位置$运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$ placeholder的替换是单个值
但我还在等待那个奇迹...... 有没有其他干净/美丽的方式在一次拍摄中进行更新?
答案 0 :(得分:1)
可悲的是,位置操作员只能持有一个值。我不认为您可以使用当前的数据结构一次性执行此更新。
您可以执行一次查找以获取第一个数组索引,然后执行第二次使用位置运算符,但此时您可以遍历数组并重新保存文档。
通过对您的馆藏进行一些重组,您可以将更新下载到单个操作中。查看MongooseJS populate。