Используя DBrefs, вы можете хранить ссылки на документы вне своей коллекции или даже в другой базе данных mongodb. Вам нужно будет получить ссылки в отдельных запросах, разные драйверы обрабатывают это по-другому, например, с помощью драйвера python вы можете auto dereference.
Пример ваших в Js оболочке может выглядеть следующим образом:
> red_car = {"color": "red", "model": "Ford Perfect"}
{"color": "red", "model": "Ford Perfect"}
> db.cars.save(red_car)
> red_car
{
"color" : "red",
"model" : "Ford Perfect",
"_id" : ObjectId("4f041d96874e6f24e704f887")
}
> // Save as DBRef
> alonso = {"name": "Alonso", "owns": [new DBRef('cars', red_car._id)]}
{
"name" : "Alonso",
"owns" : [
{
"$ref" : "cars",
"$id" : ObjectId("4f041d96874e6f24e704f887")
}
]
}
> db.people.save(alonso)
Как вы можете видеть DBRefs является формальной спецификацией для ссылок объектов, которые всегда содержит ObjectId
, но может также содержать информацию о базе данных и Коллекция. В приведенном выше примере вы можете увидеть, что он хранит коллекцию cars
в поле $ref
.Поиск тривиальна, как вы просто сделать запрос на dbref:
> dbref = new DBRef('cars', red_car._id)
> red_car_owner = db.people.find({"owns": {$in: [dbref]}})[0]
> red_car_owner
{
"_id" : ObjectId("4f0448e3a1c5cd097fc36a65"),
"name" : "Alonso",
"owns" : [
{
"$ref" : "cars",
"$id" : ObjectId("4f0448d1a1c5cd097fc36a64")
}
]
}
разыменования можно сделать с помощью команды fetch()
в оболочке:
> red_car_owner.owns[0].fetch()
{
"_id" : ObjectId("4f0448d1a1c5cd097fc36a64"),
"color" : "red",
"model" : "Ford Perfect"
}
Однако в зависимости от вашего случая использования вы можете захотеть, чтобы оптимизировать это и написать код, который итерации над массивом owns
, и делает как можно меньше find()
запросов ...
В NoSQL предпочтительнее иметь встроенные документы по ссылке на другие коллекции. Пусть «автомобили» и «дома» будут встроены в коллекцию «людей» – Arseny
@ Арсений: Как насчет случаев, когда (а) «автомобили» и «дома» могут принадлежать более чем одному человеку; и (б) «автомобили» и «дома» обычно (а также) запрашиваются отдельно, без какого-либо лица и без учета каких-либо отношений с его владельцем? Должен ли я представлять эти документы как сами по себе, так и встроенные в документы в коллекцию людей? –