首页 文章

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

提问于
浏览
3

我在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}执行所有插入操作,并且我获得的重复值不会被插入操作返回,而是实际插入到集合中 .

2 回答

  • 3

    尝试

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

    或进行投票

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

    希望theese的声明可以帮助你解决它 .

  • 8

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

    但请查看mongodb的addToSet功能 .

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

相关问题