使用 MongoDB 从数组中删除特定项目

Posted

技术标签:

【中文标题】使用 MongoDB 从数组中删除特定项目【英文标题】:Removing specific items from array with MongoDB 【发布时间】:2012-02-21 08:02:50 【问题描述】:

我正在使用 Codeigniter 和 MongoDB 开发一个 Web 应用程序。 用户可以上传文件,其他用户可以对其发表评论。

我将 cmets 存储在主文件文档中名为 cmets 的数组中。 这一切都很好,但是如何从数组中删除特定的 cmets?

我不能使用 ID 作为键,因为用户可以添加多个 cmets。怎么会 你建议我可以做到吗?

这是我的评论数组:

"comments": [
        
            "user_id": ObjectId("4f240b433dc7937d68030000"),
            "user_name": "james",
            "user_comment": "This is a comment",
            "created_at": "2012-01-2821: 20: 44"
        ,
        
            "user_id": ObjectId("4f240b433dc7937d68030000"),
            "user_name": "mandy",
            "user_comment": "This is another comment",
            "created_at": "2012-01-2821: 31: 07"
        
    ],

【问题讨论】:

【参考方案1】:

如果您可以通过匹配用户 ID、名称或评论来识别评论项目 -- 那么您可以使用带有 $pull 修饰符的 update() 命令以及适当的条件来删除该评论。

如果您不能按照上述方式进行操作,请在 cmets 中包含一个唯一 ID(如 UUID)。

要删除评论,请执行以下操作:

db.coll.update(<cond to identify document, $pull: 'comments': 'name': <name> )

如果你使用id,这是首选:

db.coll.update(<cond to identify document, $pull: 'comments': 'id': <id> )

【讨论】:

听起来很有趣。我可以让 mongoDB 分配一个 UUID 吗?如果是,怎么做? 不。对于文档中的值,在本例中,您需要生成 UUID。 php有uniqid(),你也可以使用。 感谢您的详尽回答。这一篇的文档乏善可陈。 但是如何为数组对象中的字段添加索引? 你能展示我们如何使用 Linq for Mongo DB c# 做到这一点吗?【参考方案2】:

也许您可以在其“created_at”时间之前删除评论,因为时间是唯一的。

$db.coll.update(cond to identify document,$pull:'comments':'created_at':<>)

【讨论】:

不过,多个用户可以在同一秒内发帖,所以我会为每条评论生成一个唯一的 ID。【参考方案3】:

我认为,您在插入时已将 mongodb id 添加到每个评论中。您可以像这样创建一个新的 mongodb id;

$comment_id = new MongoID();

现在,您可以使用 $pull + $update 按 id 删除 cmets,就像 @smoorthy 的回答一样。

【讨论】:

以上是关于使用 MongoDB 从数组中删除特定项目的主要内容,如果未能解决你的问题,请参考以下文章

单击元素时从 mongodb 中删除特定的数组元素

使用更新 mongoDB 从 objectId 数组中删除

NodeJs MongoDb Mongoose - 如何从多维数组中删除项目?

从数组中删除特定项目,未按预期工作

使用功能组件/挂钩从 React 中的数组中删除特定项目

仅删除(更新查询)数组mongodb数组中的特定元素?