我有以下文件:
{
"grades" : [
{
"grade" : 80,
"mean" : 75,
"std" : 8,
"otro" : [
{
"i" : 1
},
{
"i" : 2
}
]
},
{
"grade" : 85,
"mean" : 90,
"std" : 5
},
{
"grade" : 85,
"mean" : 90,
"std" : 5,
"otro" : [
{
"i" : 3
},
{
"i" : 4
}
]
},
{
"grade" : 85,
"mean" : 95,
"std" : 6
},
{
"grade" : 90,
"mean" : 85,
"std" : 5,
"otro" : [
{
"i" : 5
},
{
"i" : 6
}
]
}
]
}
我想要做的是删除'otro.i'的子文档:2,我试过这个:
db.ejemplo.update(
{
_id: oid,
'grades':
{
$elemMatch:
{
'otro':
{
$elemMatch:
{
'i': 2
}
}
}
}
},
{
'$pull':
{
'grades':
{
'otro':
{
'i':2
}
}
}
}
);
但这会删除键'i'等于2的所有子文档'otro',
这是之前:
{
"grade" : 80,
"mean" : 75,
"std" : 8,
"otro" : [
{
"i" : 1
},
{
"i" : 2
}
]
}
这是在
之后{
"grade" : 80,
"mean" : 75,
"std" : 8
}
但我想要的结果是:
{
"grade" : 80,
"mean" : 75,
"std" : 8,
"otro" : [
{
"i" : 1
}
]
}
有什么想法吗?
答案 0 :(得分:2)
使用 $
positional operator 更新文档。这标识了要更新的数组中的元素,而不显式指定元素在数组中的位置:
db.ejemplo.update(
{
_id: oid,
'grades':
{
$elemMatch:
{
'otro':
{
$elemMatch:
{
'i': 2
}
}
}
}
},
{
'$pull': {
'grades.$.otro': {"i": 2}
}
}
)