MongoDB - 独特的多键索引无法按预期工作

时间:2012-11-06 09:59:48

标签: mongodb unique-index

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}, ...)`

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

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

P.S。

我使用{safe:true}执行所有插入操作,并且插入操作不会返回我获得的重复值,但实际插入到集合中。

2 个答案:

答案 0 :(得分:8)

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

但请查看mongodb的addToSet功能。

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

答案 1 :(得分:3)

尝试

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

或使用

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

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