【问题标题】:Removing specific items from array with MongoDB使用 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"
        }
    ],

【问题讨论】:

    标签: codeigniter mongodb


    【解决方案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 的回答一样。

    【讨论】:

      猜你喜欢
      • 2013-06-08
      • 2014-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-19
      • 2016-07-30
      • 1970-01-01
      相关资源
      最近更新 更多