2011-12-30 70 views
0

假设我有不同的收藏品不同的文件:如何在MongoDB的查询中包含不同的目录?

汽车

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

在NoSQL中,最好将嵌入式文档链接到其他集合。让'汽车'和'房屋'嵌入'人们'收藏 – Arseny 2011-12-30 09:39:23

+0

@Arseny:那么(a)“汽车”和“房屋”可以由多于一个人拥有的情况如何? (b)“汽车”和“房屋”通常会(也)被单独查询,没有人,也不会与其所有者有任何关系?我是否应该自己对这些文档进行表述,并将其嵌入“人员”集合中的文档中? – 2011-12-30 16:09:14

回答

2

使用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()查询...

+0

谢谢,罗斯。使用DBrefs是最好的解决方案。 – 2012-02-10 08:18:52

0

我觉得没有实现一次从多个集合查询的方式。我建议将它们存储在如下所示的同一个集合中,并使用type字段。

{ "_id": 32534534, "type": "car", "color": "red", ... } 
{ "_id": 93867, "type": "house", "city": "Xanadu", ... } 
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}) 
+0

我其实是想做相反的事情。我有这个人,我想找到具有'拥有'中指定的ID的文件。 – 2011-12-30 16:12:03

相关问题