2014-02-01 7 views
0

у меня есть документ, который выглядит следующим образом:составного индекса 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, я часто беру документы, когда установлены определенные разрешения, поэтому мне понадобится индекс в массиве разрешений. Поскольку я знаю, что это, вероятно, также важно, я буду добавлять больше различных типов значений для массива разрешений в будущем. Таким образом, ключ «группы» может быть не единственным в будущем.

ответ

0

В настоящее время индексы, уникальные или нет, работают над всей коллекцией не по поддокументу.

Если вы хотите какую-то уникальность на поддокументе вы могли бы использовать магию запроса:

db.c.update({ 
    name: 'Sammaye', 
    'permission.group': {$ne: ObjectId()} 
}, {$push:{permission:{group: ObjectId(), u: 31}}}); 

Это, конечно, только если обновление sammaye не уже есть этот конкретный group запись. Не стесняйтесь изменять его по мере необходимости.

Смежные вопросы