为什么$ pushAll已弃用但$ pullAll不?

时间:2014-05-29 04:28:35

标签: mongodb

mongodb文件说$ pushAll是Deprecated since version 2.4: Use the $push operator with $each instead.

所以我将{$ pushAll:data}的所有内容更改为{$ push:{$ each:$ data}}

这是一项无聊的工作!

我是否需要将{$ pullAll:data}替换为{$ pull:{$ each:$ data}},然后将来不需要这样做?

或者$ pullAll不会在近期弃用?

1 个答案:

答案 0 :(得分:0)

用法实际上有点不同,因此"直接的未来"弃用似乎没有多大意义。 $each修饰符类型统一了API,不仅适用于$push,还适用于$addToSet,因此有这个原因。

在其中任何一项操作中,你都不是那么多"查询"数据,但指定要插入的对象。这些可能只是标量值,也可能是要添加到数组中的完整子文档。

让我们考虑一个文档中的数组:

{ "list": [ 0, 1, 1, 3, 2, 4, 5, 5] })

除了$pullAll之外,还有$pull运算符实际上将查询作为参数。这意味着$pullAll操作实际上只是简写:

db.test.update({},{ "$pull": { "list": { "$in": [ 1,2,5 ] } } })

值得注意的是"简写"此处$pullAll的表示法仅适用于标量值,而使用$pull的查询文档表单实际上可以删除$pullAll无法使用的子文档表单。考虑到这一点:

{ "list": [{ "name": "fred", "age": 20 },{ "name": "barney", "age": 20 }] }

您无法使用$pullAll删除所有"age": 20元素,而是需要$pull的查询形式,更不用说将整个文档指定为{{3}的参数可能不会是你想要的:

db.test.update({},{ "$pull": { "list": {  "age": 20 } } })

另外值得注意的是,有些人可能已经预料到$each,但由于我们正在查询数组的元素,因此作为"查询文档"几乎可以隐含使用。应用于数组元素。

所以关于弃用的一般回应,我不这么认为,因为用例不同而且没有必要统一"与$elemMatch的情况一样,使用另一个运营商的行动。

如果你真的那么担心,我会说上面显示的$addToSet表格仍然存在一段时间。