我有一个小部件集合,其中包含如下记录:
{ "_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 的例子:根据您使用的驱动程序和/或框架,可能有一些辅助函数可以更轻松地填充相关数据。这些辅助函数最终将导致多个查询,因为目前没有服务器端对连接的支持。
一些带有助手的框架示例(不打算成为一个完整的列表):
mongo
增加了对可查询视图/虚拟集合的支持您可能会注意到,我说过目前没有服务器端支持填充数据。实际上
$lookup
,在 MongoDB 3.1.x 开发周期中,聚合框架中添加了一个新的运算符(这将在 MongoDB 3.2 的最终生产版本系列中达到高潮)。有关更多信息,请参阅: MongoDB Jira 问题跟踪器中的SERVER-19095。请尝试以下查询
上面的查询将使用小部件连接位置对象并使用加拿大位置进行过滤。