【问题标题】:MongoDB - no duplicate entries for a keyMongoDB - 没有重复的键条目
【发布时间】:2023-03-10 03:05:02
【问题描述】:

首先,我已经阅读了this thread,它并没有真正帮助我解决这个特殊问题。我也是 MongoDB 新手。

我的db.songs 收藏中有一个文档:

{
    "title" : "Ignorance"
    "artist" : "Paramore"
    "listeners" : ["John", "Bill", "Amber"]
}

我希望在 users 键上强制不重复,这样每当我按下“John”或现有用户时,我都会收到错误消息。我可以在 mongo shell 中执行此操作吗?如果可以,我如何配置我的集合以使用此行为?

一些示例代码应该给我一个重复的错误(或一些类似的错误):

db.songs.update({title:"Ignorance"}, {'$push':{listeners:"John"}})

提前谢谢你。

【问题讨论】:

  • 也许这个文档页面会有所帮助 - docs.mongodb.org/manual/core/index-multikey
  • 我尝试了db.songs.ensureIndex({listeners:1},{unique:true}),但它阻止了我制作具有相同听众的新歌。不过我可能用错了。
  • 唯一索引不起作用!它是集合范围的,这可能就是您遇到错误的原因,删除该索引并改用 $addToSet

标签: mongodb mongo-shell


【解决方案1】:
db.songs.ensureIndex({listeners:1},{unique:true})

添加此索引将不起作用。 MongoDB 不会使用唯一索引确保子文档内的唯一性,而是会在整个集合范围内进行。这很可能就是您在使用时遇到错误的原因。

您想要做的是使用将项目添加到项目“集合”的东西,这就是 $addToSet (http://docs.mongodb.org/manual/reference/operator/update/addToSet/) 的用武之地。

删除您的索引并使用该运算符,它应该可以工作。

【讨论】:

  • 正是我需要的!谢谢。
  • 我很抱歉迟到了一个问题,但是每当我使用 addToSet 时,即使没有添加任何内容(也就是字段内已经有相同的元素),我也不会出现任何错误。如何知道添加是否成功?我正在使用 Mongoose 和 NodeJS。
  • @kir 是的,addtoset 目前没有告诉你它是否重复,你可以使用查询魔法来解决这个问题,基本上添加到你的 find() 中,比如listeners:{$ne:'John'} 但是某处有一个 JIRA addtoset 无法添加时抛出失败
  • @kir 好的,似乎在 2.6 中已修复:jira.mongodb.org/browse/SERVER-2769 尝试升级
猜你喜欢
  • 1970-01-01
  • 2021-09-09
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 2018-04-09
  • 2017-02-17
  • 2014-12-30
相关资源
最近更新 更多