Как создать уникальный индекс только для внутреннего объекта, а не для всей коллекции? - PullRequest
0 голосов
/ 03 июля 2018

У меня есть человек bson:

{
  "name": "John",
  "age": 35,
  "kids": [
    {
      "name": "tom",
      "age": 5
    },
    {
      "name": "tina",
      "age": 3
    }
  ]
}

у пресона есть список детей, как вы можете видеть, и я не хочу разрешать вставку человека с такими же именами. а также не человек с таким же именем.

поэтому я добавил индекс для "name" и "kids.name", но это не позволит вообще иметь детей с одинаковыми именами ...

так что теперь это будет запрещено:

{
  "name": "Mary",
  "age": 33,
  "kids": [
    {
      "name": "tom",
      "age": 1
    },
    {
      "name": "ron",
      "age": 5
    }
  ]
}

но я хочу иметь возможность вставить другое имя человека с именем ребенка, которое уже существует.

так как я могу сделать так, чтобы имя ребенка было уникальным только в одном и том же объекте?

1 Ответ

0 голосов
/ 03 июля 2018

Исходя из ваших требований, вам нужно создать один составной индекс вместо двух отдельных индексов, чтобы достичь этого.

См. Составной индекс MongoDB для получения информации о составных индексах.

Например:

> db.test.find()
{
  "_id": ObjectId("5b3afb61bb700c264fcfb8d3"),
  "name": "John",
  "age": 35,
  "kids": [
    {
      "name": "tom",
      "age": 5
    },
    {
      "name": "tina",
      "age": 3
    }
  ]
}
{
  "_id": ObjectId("5b3afb6bbb700c264fcfb8d4"),
  "name": "Mary",
  "age": 33,
  "kids": [
    {
      "name": "tom",
      "age": 1
    },
    {
      "name": "ron",
      "age": 5
    }
  ]
}

Создание этого составного индекса даст то, что вам нужно:

> db.test.createIndex({name:1, 'kids.name':1}, {unique:true})
{
  "createdCollectionAutomatically": false,
  "numIndexesBefore": 1,
  "numIndexesAfter": 2,
  "ok": 1
}

Однако создание уникального индекса в kids.name не будет работать, потому что у John и Mary есть ребенок с именем tom:

> db.test.createIndex({'kids.name':1}, {unique:true})
{
  "operationTime": Timestamp(1530592138, 1),
  "ok": 0,
  "errmsg": "E11000 duplicate key error collection: test.test index: kids.name_1 dup key: { : \"tom\" }",
  "code": 11000,
  "codeName": "DuplicateKey"
}

С точки зрения этого конкретного индекса, смотрите связанные ресурсы индексов MongoDB и особенно:

, поскольку в этом примере индекс представляет собой составной-многопользовательский-уникальный индекс .

То есть:

  • Комбинация каждого name + kids.name должна быть уникальной в коллекции ( ограничение уникального индекса )
  • Индекс не поможет с сортировкой на основе kids.name, но может помочь сортировке на основе name ( ограничение составного индекса )
  • Индекс будет перечислять и создавать одну запись индекса для комбинации name + kids.name ( ограничение индекса для нескольких клавиш )

Другими словами, этот индекс не позволит больше никому по имени John с ребенком по имени tom или tina в коллекцию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...