MongoDB - 唯一的多键索引没有按预期工作

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

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

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

附言

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

最佳答案

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

但是请查看 addToSet mongodb 的功能。

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

关于MongoDB - 唯一的多键索引没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13248594/

相关文章:

javascript - 如何在 Meteor 中使用按时间排序的两个不同模板显示两个不同的集合

mysql - 删除具有唯一索引的重复项

postgresql - 如何合并 UNIQUE 索引中可能有 NULL 值的两个表?

javascript - MongoDB - 当嵌套键是变量时从对象中删除($unset)嵌套键

Vagrant 上的 MongoDB 通过端口转发问题

Node.js util Promisify Mongoose 方法

MySQL 多字段唯一索引

sql - 无法从表中删除 UNIQUE 索引

MySQL UNIQUE KEY 设计 : compound INT + VARCHAR key vs. 单列 VARCHAR 键

javascript - MongoDB 对填充字段的查询