Для того, чтобы сделать вещи ясно:
- Поле
_id
является обязательным на каждом корневой документ коллекции. Он используется для уникально идентифицирует ваш документ. Подумайте об этом как о первичном ключе в своей коллекции. Существует всегда индекс на этом _id
поле.
- Обычно, нет уникального идентификатора для встроенных документов (они просто не нуждаются в том, что: встроенные документах действительно часть своего родительского документа - это не вид на два «присоединились к» коллекции).
- Но, вы можете добавить поле id во встроенные документы, например, в качестве внешнего ключа. Даже если это может быть довольно запутанным, вы можете даже назвать это
_id
, если хотите. Однако в этом контексте он не будет иметь особого значения.
Поскольку базы данных NoSQL имеют тенденцию использовать денормализованную схему, в MongoDB довольно распространено использование одинаковых документов в разных корневых документах. Фактически, это один из способов представления отношений «многие ко многим».
Вот вполне допустим пример (даже если, как я уже говорил ранее, использование _id
как имя поля может быть запутанным на первый взгляд):
{
_id: "123",
name: "sylvain",
friends: [ ]
},
{
_id: "245",
name: "sonia",
friends: [ {
_id: 123,
name: "sylvain"
} ]
},
{
_id: "456",
name: "bob",
friends: [ {
_id: 123,
name: "sylvain"
} ]
}
Как о наличии идентичные документы, встроенные в то же родительский документ: это может быть способ «подсчитать» число ber ссылок от родителя к ребенку. Подумайте о соотношении родительский-дочерний документ в виде графика. Возможно, у вас может быть две ссылки с одного узла на другой. С другой стороны, можно было бы подумать о добавлении некоторого поля «веса» во встроенный документ (так, чтобы присвоить ссылку ). В зависимости от вашего варианта использования оба решения могут иметь плюсы и минусы.
Вот пример с использованием двух различных моделей, представляющих следующие факты:
«Клиент Сильвен в настоящее время занимают два купоны на бесплатную MP3 скачать на нашем магазине»
// customer
{
_id: "123",
name: "sylvain",
coupons: [ {
_id: 9905,
desc: "Free MP3 download"
},
{
_id: 9905,
desc: "Free MP3 download"
} ]
}
В качестве альтернативы, можно подумать об этом больше:
// customer
{
_id: "123",
name: "sylvain",
coupons: [ {
_id: 9905,
desc: "Free MP3 download",
qty: 2
} ]
}
Как и я, я думаю, что это не так очевидно, если последний действительно лучше прежнего. Например, в последнем случае, когда клиент использует купон, вам нужно будет decrease the qty -- and remove the coupon if qty == 0
. Кажется, это больше, чем в первом случае. Но YMMV.
Да, _id должен быть уникальным – apneadiving
@apneadiving, что вы подразумеваете под «должен быть уникальным»? Дублирующая ситуация с идентификаторами может иметь смысл или не должна произойти? – benams
Я думаю, что это не имеет смысла – apneadiving