2011-12-30 68 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

相關問題