у меня есть документ, который выглядит следующим образом:составного индекса MongoDB, чтобы обеспечить уникальность в пределах вложенных документов
{
"_id" : ObjectId("52ed4a833004dcaf9e224459"),
"name": "unique name",
"permission" : [
{
"group" : ObjectId("52ed4a973004dcaf9e22445a"),
"u" : 31
}
]
}
Я хотел бы, чтобы убедиться, что «разрешение» массив может содержать только одну записи с ключом «группы 'и конкретное значение. Однако может быть несколько записей с одним и тем же ключом и разными значениями. Я попытался установить индекс соединения на уникальном поле и «permission.group», но я все еще был в состоянии вставить дублирующие документы:
db.user.ensureIndex({'name':1, 'permission.group':1}, {unique:1, sparse:1})
Я также попытался установить индекс соединения на другой уникальный индекс и permission.group , как рекомендовано в другом вопросе о SO.
db.user.ensureIndex({name: 1}, {unique: 1, name: 'name_1'})
db.user.ensureIndex({'name_1':1, 'permission.group':1}, {unique:1, sparse:1})
но приводят к ошибке:
"err" : "E11000 duplicate key error index:People.user.$name_1_1_permission.group_1 dup key: { : null, : ObjectId('52ed4a973004dcaf9e22445a') }",
Тем не менее, в настоящее время нет пользователя присутствует в БД, которая имеет дублирующие набор разрешений. Если я установил dropDups в true, это приведет к удалению всех пользователей, кроме одного, которые содержат разрешение для данной группы. Таким образом, это не работает, как мне бы хотелось. Можно ли установить уникальный индекс с помощью mongodb для достижения того, что я ищу?
Btw, я часто беру документы, когда установлены определенные разрешения, поэтому мне понадобится индекс в массиве разрешений. Поскольку я знаю, что это, вероятно, также важно, я буду добавлять больше различных типов значений для массива разрешений в будущем. Таким образом, ключ «группы» может быть не единственным в будущем.