在我的场景中,一个集合中有作者,每个作者有messages个,每个作者的信息可以有events个.每个演员只允许表演一种动作一次.

db.people.ensureIndex({messages.messageEvents.eventName: 1, messages.messageEvents.actorId: 1}, {unique: true});

我添加了索引,但没有效果.正如你在下面看到的,我的文档有三个元素,分别是"eventName":"vote""actorId":"1234",这应该是我的限制.

如何确保基于eventNameactorId字段的messageEvents数组中的唯一项?

实际上,我需要更新现有项目,而不需要第二次搜索和更新事件,而不是拒绝它.

{
  "_id": "1234567",
  "authorPoint": 0,
  "messages": [
    {
      "messageId": "112",
      "messageType": "Q",
      "messagePoint": 0,
      "messageEvents": [
        {
          "eventName": "Add",
          "actorId": "1234",
          "detail": ""
        },
        {
          "eventName": "Vote",
          "actorId": "1234",
          "detail": "up"
        },
        {
          "eventName": "Vote",
          "actorId": "1234",
          "detail": "down"
        },
        {
          "eventName": "Vote",
          "actorId": "1234",
          "detail": "cork"
        }
      ]
    }
  ]
}

推荐答案

Mustafa,唯一约束不是在单个数组中强制执行的,尽管它们是在集合中的文档之间强制执行的.这是一个暂时无法修复的已知错误:

https://jira.mongodb.org/browse/SERVER-1068

不过,还有一个解决办法.保持你的唯一索引,并且:

1) 确保应用程序不会在数组中插入具有重复值的新文档.在插入之前,可以判断应用程序代码中的唯一性.

2) 更新现有文档时,请使用$addToSet而不是$push.

Mongodb相关问答推荐

MongoDB聚合:将文档列表转换为列表

如何在MongoDB中正确解析佛年?

GO:如何在MongoDB中区分空字符串和nil

在出现错误时忽略mongodb事务回滚是好做法吗

筛选出嵌套数组中的记录Mongo DB聚合

MongoDB 对特定搜索查询的响应时间较长

MongoDB 按 created_at 月聚合

在我的查询中使用 populate() 时的 MongoDB createIndex()

从 mongodb Golang 检索时判断零等效时间.时间

从 node.js 的 mongodb 集合中删除文档

Mongo C#忽略属性

.insertOne 不是函数

SELECT 字段 AS `anothername` 的 mongodb 等效项

返回从循环中调用的数据库查询中检索到的数据的问题

MongoDB展开多个数组

Python - Pymongo 插入和更新文档

MongoDB 按数组元素对文档进行排序

从 nodejs 到 mongodb 或 mongoose 的动态数据库连接

MongoDB InsertMany 与 BulkWrite

我需要手动关闭mongoose连接吗?