如何在MongoDB中的查询中包含不同的目录?

时间:2011-12-30 08:04:50

标签: mongodb nosql

假设我在不同的集合中有不同的文档:

汽车

{ "_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

3 个答案:

答案 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})