4

我对 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} 进行所有插入,并且我得到的重复值不是由插入操作返回,而是实际插入到集合中。

4

2 回答 2

10

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

但是请查看 mongodb 的addToSet功能。

这里也是这个非常相似的问题。如何确保基于特定字段的数组中的唯一项 - mongoDB?

于 2012-11-06T10:17:46.043 回答
3

尝试

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

或处理投票

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

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

于 2012-12-13T18:25:26.643 回答