Исходя из ваших требований, вам нужно создать один составной индекс вместо двух отдельных индексов, чтобы достичь этого.
См. Составной индекс 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
в коллекцию.