Mongodb

mongoDB:查詢具有對象引用的文件

  • February 25, 2021

我有一個小元件集合,其中包含如下記錄:

{ "_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第二個集合的查詢。

下面是一個使用mongoshell 的例子:

// 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

引用自:https://dba.stackexchange.com/questions/107101