【问题标题】:How do I remove just one Element from MongoDB Array that equals a value?如何从 MongoDB 数组中仅删除一个等于一个值的元素?
【发布时间】:2016-12-10 21:05:05
【问题描述】:

我在 mongo db 中有一个整数数组。有些值会像这样多次出现:

{binder : [4,7,9,7]}

我像这样对集合使用拉动

{ $pull: { binder: 7} }

它将删除所有 7 个,我最终得到:

{binder : [4,9]}

但是,我只想删除其中一个 7 来获得这样的结果:

{binder : [4,7,9]}

我会怎么做。数字的索引是未知的,重复并不总是在最后/第一个位置。

经过长时间的尝试和搜索,我找到了一种 $indexOfArray 不支持我需要使用它的方法。

【问题讨论】:

    标签: arrays json mongodb


    【解决方案1】:

    目前没有办法只从数组中删除一项,如文档中所述“$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 作为有效值)

    【讨论】:

    • 这很好用。谢谢。再问一个问题。使用这样的数组不是很好吗?有没有更好的方法来简单地存储数字 - 或者他们只是因为有变通方法而没有将其实现为函数?
    • 这完全取决于你的用例,如果你在数组中有一个更复杂的对象,你可以附加一个唯一的_id,这样你就可以获得你想要删除的项目的句柄。刚刚进行了快速搜索,Jira 中有一个问题 - jira.mongodb.org/browse/SERVER-1014
    【解决方案2】:

    在较新版本的 mongo 中使用 $pullAll

    https://docs.mongodb.com/manual/reference/operator/update/pullAll/

    最佳答案已过时。

    【讨论】:

    • 答案仍然回答了问题。关心解释什么问题? (如果可以的话,也许可以对答案发表评论,以便通知该人)
    猜你喜欢
    • 1970-01-01
    • 2016-04-03
    • 2018-11-08
    • 2012-04-19
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-04
    相关资源
    最近更新 更多