Используя DBrefs , вы можете хранить ссылки на документы вне вашей коллекции или даже в другой базе данных mongodb.Вам придется извлекать ссылки в отдельных запросах, разные драйверы обрабатывают это по-разному, например, с помощью драйвера python вы можете автоопределение .
Ваш пример в оболочке 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)
Как видите, DBRef - это формальная спецификация для ссылок на объекты, которая всегда содержит 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()
...