MongoDB:如何删除嵌套文档v字段中索引1的数据
问题根源与解决方案
哈哈,我一眼就发现问题所在了——你用错操作符啦!
为什么$pull不管用?
你的v字段不是数组,而是一个键为字符串数字("0"、"1")的普通对象:
{
"v" : {
"0" : { "d" : { ... }, "e" : 741.3 },
"1" : { "d" : { ... }, "e" : 711.3 }
}
}
而MongoDB的$pull操作符是专门用来从数组中移除元素的,对这种键值对结构的对象完全无效。
正确的删除方法
要移除对象里的"1"这个键,你需要用$unset操作符:
// 替换yourCollection为你的集合名称 db.yourCollection.updateOne( { "_id": ObjectId("5ac46fe0d2306b0fd746a09c") }, { "$unset": { "v.1": "" } } )
$unset会直接把指定的键从对象中删除,这里赋值为空字符串只是占位,任何值都可以(MongoDB会忽略这个值,只处理键的删除)。
可选:把v转为数组(方便后续用$pull)
如果之后你希望用$pull这类数组操作符,建议把v从对象转换成真正的数组。可以用管道更新来实现:
db.yourCollection.updateOne( { "_id": ObjectId("5ac46fe0d2306b0fd746a09c") }, [ // 先把对象转成[{k:"0", v:{...}}, {k:"1", v:{...}}]的数组 { "$set": { "v": { "$objectToArray": "$v" } } }, // 提取每个元素的v值,得到纯数据数组 { "$set": { "v": "$v.v" } } ] )
转换后v会变成:
[
{ "d" : { ... }, "e" : 741.3 },
{ "d" : { ... }, "e" : 711.3 }
]
这时再用$pull就可以正常操作数组元素啦!
内容的提问来源于stack exchange,提问作者Aniruddha Kumbhar
相关产品推荐
相关产品推荐

