不少文章中建議用embedded document或manual references解決問題, 但這顯然不適用於所有場景.
以如下場景為例:
有collection cars, 記錄的是每輛汽車的信息:
{_id:...,
owner:...,
plate_number:...,
location:...,
model:<model_id>,
...
}
另一個collection models, 記錄的是每種汽車型號的參數:
{_id:<model_id>,
name:...,
transmission:...,
displacement:...,
seats:...,
...
}
cars和models中的記錄數都是數萬條. 現在需要檢索出所有排量少於2L的自動擋車輛. 對於關係數據庫, 可以使用INNER JOIN非常簡單的解決這個問題, 但在MongoDB中麻煩許多.
如果想用embedded document解決問題, 就要將原本存於models的型號參數放入cars, 這顯然不是一個好主意.
如果用manual references,可以先查詢出符合條件的型號列表, 再查找相應車輛:
modelLst = models.find({transmission: 'A', displacement: {$lt: 2}}, {_id: 1}).map(function(item) {return item['_id']})
cars.find({model: {$in: modelLst}})
這樣做也有一個問題: $in查詢花費的時間和modelLst的長度是O(n)關係, 當modelLst較大時, 這個查詢會花費過多的時間. 在cars的model上建立索引不能解決此問題.
對於以上場景, 你們會如何處理?