【问题标题】:MongoDB - unique multikey index not working as expectedMongoDB - 唯一多键索引未按预期工作
【发布时间】:2012-11-06 09:59:47
【问题描述】:

我在 MongoDB 中遇到了多键索引问题。

我有一个名为 users 的集合,它的文档或多或少像这样:

{
  "_id": ObjectId(),
  "name": "John Smith",
  ...
  "votes": [
    {
      "type": "news",
      "votedObjectId": "123"
    },
    {
      "type": "blog",
      "votedObjectId": "124"
    },
    {
      "type": "news"
      "votedObjectId": "225"
    }
  ]
}

我想在votedObjectId 上创建一个索引,并且我希望用户对每篇文章只投票一次。

我确保了唯一索引(代码在 node.js - mongoskin 模块中)

`this.ensureIndex({'votes.votedObjectId': 1}, {unique: true}, ...)`

然后我尝试为同一篇文章投票两次,它实际上添加了两次完全相同的投票。

如何确保数组不包含重复元素?

附言

我使用 {safe: true} 进行所有插入,我得到的重复值不是由插入操作返回,而是实际插入到集合中。

【问题讨论】:

    标签: mongodb unique-index


    【解决方案1】:

    {unique: true} 只保证对象间的唯一性,不保证数组内数组元素的唯一性。

    但请查看 mongodb 的 addToSet 功能。

    这里也是这个非常相似的问题。 How to ensure unique item in an array based on specific fields - mongoDB?

    【讨论】:

    • 谢谢。程序级唯一性检查 + $addToSet 而不是 $push 似乎是我的最佳解决方案。
    【解决方案2】:

    试试

    this.ensureIndex({'votes.votedObjectId': 1, _id: 1}, {unique: true}, ...) 
    

    或处理投票

    this.update( 
      { _id:... , 'votes.votedObjectId':{$ne:'...'} }, 
      { $push: { votes: '...' }}
    )
    

    希望这些陈述可以帮助您解决问题。

    【讨论】:

      猜你喜欢
      • 2014-05-29
      • 1970-01-01
      • 2013-10-06
      • 1970-01-01
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 2019-04-18
      • 1970-01-01
      相关资源
      最近更新 更多