因此,您是正确的,因为$pull
运算符完全按照文档中的说明进行操作,因为它的参数实际上是用于匹配要删除的元素的“查询”。
如果您显示的数组内容碰巧总是将元素置于“第一个”位置,则$pop
操作员实际上会删除该第一个元素。
使用基本节点驱动程序:
collection.findoneAndUpdate( { "array.0": "bird" }, // "array.0" is matching the value of the "first" element { "$pop": { "array": -1 } }, { "returnOriginal": false }, function(err,doc) { });对于mongoose,返回修改后的文档的参数是不同的:
MyModel.findoneAndUpdate( { "array.0": "bird" }, { "$pop": { "array": -1 } }, { "new": true }, function(err,doc) { });但是,如果不知道要删除的“第一个”项的数组位置,它们都没有多大用处。
对于这里的一般方法,您需要“两次”更新,一次更新以匹配第一个项目,并用唯一要删除的东西替换它,第二次实际删除该修改后的项目。
如果应用简单的更新而不要求返回文档,则这要简单得多,并且还可以跨文档批量进行。使用async.series之类的内容也有助于避免嵌套您的调用:
async.series( [ function(callback) { collection.update( { "array": "bird" }, { "$unset": { "array.$": "" } }, { "multi": true } callback ); }, function(callback) {collection.update( { "array": null }, { "$pull": { "array": null } }, { "multi": true } callback); } ], function(err) { // comes here when finished or on error });因此,将$unset
此处与位置
$运算符一起使用可将“第一”项更改为
null。然后,带有的后续查询
$pull仅从
null数组中删除任何条目。
这就是从数组中安全删除值的“第一个”出现的方法。确定该数组是否包含多个相同的值是另一个问题。



