E11000 двойной индекс ошибки [дубликат]

Это означает, что ваш код использовал ссылочную переменную объекта, которая была установлена ​​в нуль (т. е. она не ссылалась на экземпляр фактического объекта).

Чтобы предотвратить ошибку, объекты, которые могут быть пустыми, должны быть протестированы для null перед тем, как использовать.

if (myvar != null)
{
    // Go ahead and use myvar
    myvar.property = ...
}
else
{
    // Whoops! myvar is null and cannot be used without first
    // assigning it to an instance reference
    // Attempting to use myvar here will result in NullReferenceException
}
19
задан Electric Monk 19 July 2011 в 08:48
поделиться

3 ответа

Насколько я знаю, уникальные индексы только применяют уникальность в разных документах, поэтому это приведет к дублированию ключевой ошибки:

db.cats.insert( { id: 123, kittens: [ { id: 456 } ] } )
db.cats.insert( { id: 123, kittens: [ { id: 456 } ] } )

Но это разрешено:

db.cats.insert( { id: 123, kittens: [ { id: 456 }, { id: 456 } ] } )

Я не уверен, что какой-либо способ обеспечит ограничение, которое вам нужно на уровне Монго, возможно, это то, что вы можете проверить в логике приложения при вставке обновления?

26
ответ дан Chris Fulstow 27 August 2018 в 23:20
поделиться

Обеспечение уникальности отдельных значений в поле массива

В дополнение к приведенному выше примеру в MongoDB есть функция, гарантирующая, что при добавлении нового объекта / value в поле массива, что он будет выполнять обновление только в том случае, если значение / объект еще не существует.

Итак, если у вас есть документ, который выглядит следующим образом:

{ _id: 123, kittens: [456] }

Это будет разрешено:

db.cats.update({_id:123}, {$push: {kittens:456}})

, что приводит к

{ _id: 123, kittens: [456, 456] }

, однако использование функции $ addToSet (в отличие от $ push) проверяет, существует ли уже существующее значение перед добавлением его. Итак, начиная с:

{ _id: 123, kittens: [456] }

, тогда выполнение:

db.cats.update({_id:123}, {$addToSet: {kittens:456}})

Не было бы никакого эффекта.

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

23
ответ дан doublehelix 27 August 2018 в 23:20
поделиться

Существует эквивалент вставки с uniquness в атрибуте массива. Следующая команда, по существу, вставляет, сохраняя уникальность котят (upsert создает ее для вас, если объект с 123 еще не существует).

db.cats.update(
  { id: 123 },
  { $addToSet: {kittens: { $each: [ 456, 456] }}, $set: {'otherfields': 'extraval', "field2": "value2"}},
  { upsert: true}
)

Результирующее значение объекта будет

{
    "id": 123,
    "kittens": [456],
    "otherfields": "extraval",
    "field2": "value2"
}
3
ответ дан timchunght 27 August 2018 в 23:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: