如何在MongoDB中的数组中拉一个项目的实例?

根据文件:

$ pull操作符从现有数组中移除一个或多个匹配指定条件的值的实例。

是否有一个选项只删除一个值的第一个实例? 例如:

var array = ["bird","tiger","bird","horse"] 

如何在更新呼叫中直接删除第一个“鸟”?

所以你是正确的, $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条目。

这就是如何从数组中安全地删除“第一”值的情况。 要确定数组是否包含多个相同的值,虽然是另一个问题。

Mongo还没有实现这个function是一团糟。 但是,我们开发了一种解决方法,可以使用唯一语句更新文档来解决此问题。

诀窍包括维护一个存储要删除的值的子文档。 用你的例子,你将会有如下的东西。

 { array: ["bird","tiger","bird","horse"], toDelete: ["bird"] } 

任何时候你想从array删除一个元素,就可以把它添加到toDelete数组中。

显然,你必须改变你从集合中读取信息的方式。 每次需要检索存储在array信息时,都必须记得toDelete的元素。 我认为最后一个操作应该只使用某种编程语言(Js,Java等)中的脚本来执行。

请注意,一旦使用脚本来检索信息,可以使用toDelete数组值来删除数组中第一次出现的这些值。

当数组的减法数量相对小于加法数时,此解决scheme的效果最好。

希望能帮助到你。