为了账号安全,请及时绑定邮箱和手机立即绑定

在mongoDb中,如何通过索引删除数组元素

/ 猿问

在mongoDb中,如何通过索引删除数组元素

qq_花开花谢_0 2019-08-19 10:22:18

在mongoDb中,如何通过索引删除数组元素

{

        "_id" : ObjectId("4d1cb5de451600000000497a"),           
        "name" : "dannie",  
        "interests" : [  
            "guitar",  
            "programming",           
            "gadgets",  
            "reading"  
        ]   }

在上面的示例中,假设上面的文档位于db.people集合中。如何通过它的索引删除兴趣数组的第3个元素?

编辑:

这是我目前的解决方案:

var interests = db.people.findOne({"name":"dannie"}).interests;  interests.splice(2,1)  db.people.update({"name":"dannie"}, {"$set" : {"interests" : interests}});

有更直接的方式吗?


查看完整描述

3 回答

?
烧仙草VB

没有直接的数组索引拉/删的方法。事实上,这是一个公开的问题http://jira.mongodb.org/browse/SERVER-1014,你可以投票支持它。

解决方法是使用$ unset然后$ pull:

db.lists.update({}, {$unset : {"interests.3" : 1 }}) db.lists.update({}, {$pull : {"interests" : null}})

更新:如某些评论中所述,此方法不是原子的,如果其他客户端在两个操作之间读取和/或写入,则可能导致某些竞争条件。如果我们需要将操作变为原子操作,我们可以:

  • 从数据库中读取文档

  • 更新文档并删除阵列中的项目

  • 替换数据库中的文档。为了确保文档在我们阅读后没有更改,我们可以使用更新,如果mongo文档中描述的当前模式


查看完整回答
反对 回复 2019-08-19
?
郎朗坤

您可以使用操作$pull修饰符update来删除数组中的特定元素。如果您提供的查询将如下所示:

db.people.update({"name":"dannie"}, {'$pull': {"interests": "guitar"}})

此外,您可以考虑使用$pullAll删除所有事件。更多关于官方文档页面的内容 - http://www.mongodb.org/display/DOCS/Updating#Updating-%24pull

这不会使用索引作为删除元素的条件,但在类似于您的情况下仍然可能有所帮助。IMO,使用索引来寻址数组中的元素并不是非常可靠,因为mongodb在元素顺序上并不像我所知的那样一致。


查看完整回答
反对 回复 2019-08-19
?
皈依舞

我没有使用未设置(如在接受的答案中),而是通过将字段设置为唯一值(即非NULL)来解决此问题,然后立即提取该值。从异步角度来看更安全一些。这是代码:

    var update = {};
    var key = "ToBePulled_"+ new Date().toString();
    update['feedback.'+index] = key;
    Venues.update(venueId, {$set: update});
    return Venues.update(venueId, {$pull: {feedback: key}});

希望mongo可以通过扩展$ position修饰符来支持$ pull和$ push来解决这个问题。


查看完整回答
反对 回复 2019-08-19

添加回答

回复

举报

0/150
提交
取消
意见反馈 邀请有奖 帮助中心 APP下载
官方微信