假设我在不同的集合中有不同的文档:
在汽车:
上{ "_id": 32534534, "color": "red", ... }
在房屋:
{ "_id": 93867, "city": "Xanadu", ... }
如何在人:
中检索以下文档中的相应文档{ "name": "Alonso", "owns": [32534534], ... }
{ "name": "Kublai Khan", "owns": [93867], ... }
我可以使用类似下面代码的内容吗? (请注意,我没有指定目录)
db.find({'_id': 93867})
如果没有,你会建议如何实现这一效果?
我刚刚发现了这个相关的问题:MongoDB: cross-collection queries
答案 0 :(得分:2)
使用DBrefs,您可以存储指向集合外部文档的链接,甚至可以存储在另一个mongodb数据库中的链接。您必须在单独的查询中获取引用,不同的驱动程序处理方式不同,例如使用python驱动程序auto dereference。
您在js shell中的示例可能如下所示:
> 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")
}
]
}
取消引用可以通过shell中的fetch()
命令完成:
> red_car_owner.owns[0].fetch()
{
"_id" : ObjectId("4f0448d1a1c5cd097fc36a64"),
"color" : "red",
"model" : "Ford Perfect"
}
但是,根据您的使用情况,您可能希望对此进行优化并编写一些迭代owns
数组的代码,并尽可能少地进行find()
次查询...
答案 1 :(得分:0)
我认为没有办法同时从多个集合中实现查询。我建议将它们存储在同一个集合中,如下所示type
字段。
{ "_id": 32534534, "type": "car", "color": "red", ... }
{ "_id": 93867, "type": "house", "city": "Xanadu", ... }
答案 2 :(得分:0)
您需要重新构建人员文档以添加要添加的类型
{ "name": "Alonso", "owns": {ids:[32534534],type:'car'} ... }
{ "name": "Kublai Khan", "owns":{ids:[93867],type:'house'} ... }
所以现在你可以通过
找到拥有红色汽车的人db.people.find({type:car,ids:32534534})
和
的房屋db.people.find({type:house,ids:93867})