Ссылка NullReferenceException или Object, не установленная на экземпляр объекта, возникает, когда объект класса, который вы пытаетесь использовать, не создается. Например:
Предположим, что у вас есть класс с именем Student.
public class Student
{
private string FirstName;
private string LastName;
public string GetFullName()
{
return FirstName + LastName;
}
}
Теперь рассмотрим другой класс, в котором вы пытаетесь получить полное имя учащегося.
public class StudentInfo
{
public string GetStudentName()
{
Student s;
string fullname = s.GetFullName();
return fullname;
}
}
Как видно из вышеприведенного кода, оператор Student s - объявляет только переменную типа Student, обратите внимание, что класс Student не создается в этой точке. Следовательно, когда выполняется выполнение инструкции s.GetFullName (), она выкинет исключение NullReferenceException.
Насколько я знаю, уникальные индексы только применяют уникальность в разных документах, поэтому это приведет к дублированию ключевой ошибки:
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 } ] } )
Я не уверен, что какой-либо способ обеспечит ограничение, которое вам нужно на уровне Монго, возможно, это то, что вы можете проверить в логике приложения при вставке обновления?
Обеспечение уникальности отдельных значений в поле массива
В дополнение к приведенному выше примеру в 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 проверять уникальность внутри значений элементов поля массива, только два документа не могут иметь одинаковые значения в индексированных полях.
Существует эквивалент вставки с 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"
}