如何根据特定字段确保数组中的唯一项 - mongoDB?

yuc*_*eel 17 indexing unique mongodb mongodb-query

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

db.people.ensureIndex({messages.messageEvents.eventName: 1, messages.messageEvents.actorId: 1}, {unique: true});
Run Code Online (Sandbox Code Playgroud)

我添加了索引,但没有效果.正如你看到下面,我的文档有哪些具备三个要素"eventName":"vote",并"actorId":"1234"应该是对我的约束.

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

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

{
  "_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"
        }
      ]
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

A. *_*vis 21

Mustafa,虽然它们是在集合中的文档之间强制实施的,但它们并不在单个数组中强制执行.这是一个已知错误,暂时无法修复:

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

但是有一个解决方法.保持您的独特索引,并:

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

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

  • 即使使用$ addToSet,也可以说我们以{userId:1234,投票:obama}的方式推送了一些内容,$ addToSet不会停止{userId:1234,投票:romney},如何确保对象集在仅userId? (2认同)