目前没有办法只从数组中删除一项,如文档中所述“$pull 运算符从现有数组中删除一个或多个与指定条件匹配的值的所有实例。”
但是,您可以使用此解决方法:
从数组中查找并取消设置一项:
> db.arrays.save({ s : [ 1, 2, 3, 4, 5, 5, 6, 7, 8, 9, 10 ] })
WriteResult({ "nInserted" : 1 })
> db.arrays.update({ "s" : 5 }, { $unset : { "s.$" : true } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
这将为我们提供以下信息
> db.arrays.find()
{ "_id" : ObjectId("584c707f1c86f44b7300b223"), "s" : [ 1, 2, 3, 4, null, 5, 6, 7, 8, 9, 10 ] }
然后我们可以拉nulls
> db.arrays.update({ }, { $pull: { "s" : null } })
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
我们现在删除的5 将消失:
> db.arrays.find()
{ "_id" : ObjectId("584c707f1c86f44b7300b223"), "s" : [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ] }
这是一种变通方法,但使用多个原子操作非常安全(只要您不使用 null 作为有效值)