使用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 2011-12-30 09:39:23
@Arseny:那麼(a)「汽車」和「房屋」可以由多於一個人擁有的情況如何? (b)「汽車」和「房屋」通常會(也)被單獨查詢,沒有人,也不會與其所有者有任何關係?我是否應該自己對這些文檔進行表述,並將其嵌入「人員」集合中的文檔中? – 2011-12-30 16:09:14