2012-05-28 177 views
0

我在閱讀MongoDB in Action,當談論查詢文檔中的多對多關係時,我很難理解他如何編寫他的示例查詢(使用Ruby驅動程序) 。在MongoDB中查詢多對多關係

查詢是查找特定類別中的所有產品,其中有productscategory集合。作者說,「要查詢的園藝工具類別中的所有產品,代碼很簡單:

db.products.find({category_ids => category['id']}) 

產品文檔是這樣的:

doc = 
{ _id: new ObjectId("4c4b1476238d3b4dd5003981"), 
    slug: "wheel-barrow-9092", 
    sku: "9092", 
    name: "Extra Large Wheel Barrow", 
    description: "Heavy duty wheel barrow...", 

    details: { 
    weight: 47, 
    weight_units: "lbs", 
    model_num: 4039283402, 
    manufacturer: "Acme", 
    color: "Green" 
    }, 

    category_ids: [new ObjectId("6a5b1476238d3b4dd5000048"), 
        new ObjectId("6a5b1476238d3b4dd5000049")], 

    main_cat_id: new ObjectId("6a5b1476238d3b4dd5000048"), 

    tags: ["tools", "gardening", "soil"], 

} 

和類別的文檔是這樣的:

doc = 
{ _id: new ObjectId("6a5b1476238d3b4dd5000048"), 
    slug: "gardening-tools", 
    ancestors: [{ name: "Home", 
       _id: new ObjectId("8b87fb1476238d3b4dd500003"), 
       slug: "home" 
       }, 

       { name: "Outdoors", 
       _id: new ObjectId("9a9fb1476238d3b4dd5000001"), 
       slug: "outdoors" 
       } 
    ], 

    parent_id: new ObjectId("9a9fb1476238d3b4dd5000001"), 

    name: "Gardening Tools", 
    description: "Gardening gadgets galore!", 
} 

能有人請解釋多一點給我嗎?我仍然不明白他怎麼寫的查詢:(

謝謝大家。

回答

3

的查詢檢索與該領域的的category['id']價值的產品收集的所有產品category_ids

當您搜索包含特定值的數組的字段,MongoDB的自動枚舉陣列中的每個值搜索爲比賽。

構造查詢,您必須首先注意到category集合定義你的類層次結構,且每個類別都有一個唯一的ID(存儲,如MongoDB是往常一樣,在_id場)

你必須還會注意到product集合有一個字段,其中存儲了類別ID列表category_ids,該列表引用了category集合的唯一ID。

因此,要找到所有產品中的特定類別,您搜索product收集category_ids領域您感興趣的類別,你從category收集得到的唯一的ID。

如果我寫的蒙戈基於JavaScript的shell解釋,mongo是發現產品在園藝工具種類的查詢,我將做到以下幾點:

  1. 中查找園藝工具類的ID (其中,如前面所指出的,被存儲在category集合的_id字段)
    • 在這種情況下,在您的示例值是ObjectId("6a5b1476238d3b4dd5000048")
  2. 該值插入穿過product收集
    • 這的category_ids領域的搜索查詢是,你在你的問題,這對於mongo殼我會爲寫給查詢:db.products.find({category_ids : new ObjectId("6a5b1476238d3b4dd5000048")})

我希望比原來的解釋更清晰! (另外:我不太清楚你的查詢是用什麼語言編寫的,也許是PHP?在任何情況下,javascript似乎都是MongoDB文檔中的例子的選擇語言,因爲MongoDB服務器安裝mongo命令行解釋器旁邊的服務器本身,所以每個人都可以訪問它)

+0

感謝您的詳細解釋。 Mongodb in Action書中使用Ruby代碼來處理這樣的語言示例。 – Bohn

+0

那麼在他的例子中'id'有特殊的含義,必須按原樣傳遞?這就是我感到困惑的地方。 – Bohn

+0

不能看到書,它看起來像'category_id'可能是一個數組/變量,作者用他們想要的類別的id填充(我上面的答案中的第1步)。我不認識Ruby,所以很難知道如何解釋代碼。感謝你的接納 :) – chrisbunney