Mongodb
mongoDB:查詢具有對象引用的文件
我有一個小元件集合,其中包含如下記錄:
{ "_id" : ObjectId("55a6abe193819c033d4d755a"), "name" : "widget1"} { "_id" : ObjectId("55a6abe193819c033d4d755a"), "name" : "widget2", "loc" : ObjectId("55a69475da314d9984fc6201") }
我還有一個如下所示的位置集合:
{ "_id" : ObjectId("55a69475da314d9984fc6201"), "abbrev" : "CAN", "description" : "Canada" } { "_id" : ObjectId("55a6948eda314d9984fc6202"), "abbrev" : "USA", "description" : "United States" } { "_id" : ObjectId("55a69496da314d9984fc6203"), "abbrev" : "MEX", "description" : "Mexico" }
如果我想使用 Objectid 查找位於加拿大的所有小元件,我知道我可以這樣做:
> db.widgets.find( { loc: ObjectId("55a69475da314d9984fc6201")}) { "_id" : ObjectId("55a6abe193819c033d4d755a"), "name" : "widget2", "loc" : ObjectId("55a69475da314d9984fc6201") }
但是,如果我想不使用 objectid 而是使用縮寫或描述來搜尋位置怎麼辦?我該怎麼做?
_id
要使用相關數據查詢兩個集合,常用方法(如 MongoDB 3.0)是從第一個集合中查找匹配值列表,該列表可用於$in
第二個集合的查詢。下面是一個使用
mongo
shell 的例子:// Find _ids for matching locations based on some criteria (eg. "abbrev") var matches = db.locations.find({ "abbrev": "CAN"}, { _id: 1 }) // Transform matching _id values into an array var locs = []; matches.forEach(function(match) { locs.push(match._id) }); // Look for widgets matching the location criteria db.widgets.find({"loc": {$in : locs} } )
根據您使用的驅動程序和/或框架,可能有一些輔助函式可以更輕鬆地填充相關數據。這些輔助函式最終將導致多個查詢,因為目前沒有伺服器端對連接的支持。
一些帶有助手的框架範例(不打算成為一個完整的列表):
- MongooseJS:查詢填充:Node.js 對象文件模型(ODM)框架,包括關係的聲明性模式和查詢填充
- Mongoid:關係:Ruby ODM,包括關係的聲明性模式和查詢填充
- mongo-views:互動式 shell 的實驗性外掛,
mongo
增加了對可查詢視圖/虛擬集合的支持您可能會注意到,我說過目前沒有伺服器端支持填充數據。實際上
$lookup
,在 MongoDB 3.1.x 開發週期中,聚合框架中添加了一個新的運算符(這將在 MongoDB 3.2 的最終生產版本系列中達到高潮)。有關更多資訊,請參閱: MongoDB Jira 問題跟踪器中的SERVER-19095。