使用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