使用 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 从数组中删除特定项目的主要内容,如果未能解决你的问题,请参考以下文章