MongoDB中如何删除数组指定索引位置的元素?
解决MongoDB删除数组指定索引元素的正确方法
问题原因
你之前的操作逻辑存在问题:
$unset: {"item.3": 1}并不会直接删除索引3的元素,只是把该位置的值设为null,数组长度保持不变;- 紧接着执行
$pull: {"item": null}会移除数组中所有null值,包括原本存在的两个null,所以才会得到没有任何null的结果。
正确实现方式
要精准删除数组指定索引的元素,同时保留原有null,可以用以下两种方法:
方法1:数组切片拼接(推荐,无重复元素问题)
通过$slice截取索引3之前和之后的元素,再用$concatArrays合并,直接替换原数组:
db.people.update( { _id: ObjectId('6527c64e539e51befb0db39c') }, { $set: { item: { $concatArrays: [ { $slice: ["$item", 3] }, // 取索引0-2的元素 { $slice: ["$item", 4, { $size: "$item" }] } // 取索引4到末尾的元素 ] } } } )
方法2:聚合管道过滤(注意重复元素场景)
利用$filter结合$indexOfArray,过滤掉索引等于3的元素:
db.people.update( { _id: ObjectId('6527c64e539e51befb0db39c') }, [ { $set: { item: { $filter: { input: "$item", as: "elem", cond: { $ne: [{ $indexOfArray: ["$item", "$$elem"] }, 3] } } } } } ] )
注意:如果数组中有重复元素,
$indexOfArray会返回第一个匹配元素的索引,这种情况下该方法可能误删其他位置的重复元素,更推荐方法1。
执行上述任一方法后,就能得到预期结果:
{ "_id": "6527c64e539e51befb0db39c", "category": "fruits", "dataType": "string", "isList": true, "item": [ null, "mango", "banana", "orange", null, "watermelon" ] }
内容的提问来源于stack exchange,提问作者Hitesh Verma
相关产品推荐
相关产品推荐

