我有两个收藏夹:Manager和Venue。
经理文档示例
{
"_id":"5d4f84dd4c35350b284b08ea",
"Name":"Name",
"Surname":"Surname",
"Username":"Username",
"Password":"123456",
"CreatedDate":"2019-08-11T03:00:44.981Z"
}
场地文档示例
{
"_id":"5d4f84de4c35350b284b08eb",
"Name":"Name",
"Manager":"5d4f84dd4c35350b284b08ea",
"CreatedDate":"2019-08-11T03:00:46.598Z"
}
我了解到有两种内部连接方法
第一种方式
通过两个查询解决此问题
var manager = db.manager.findOne({"id" : "5d4f84dd4c35350b284b08ea"})
var venue = db.venue.findOne({"id" : manager.id})
第二种方式
使用聚合框架的$ lookup功能仅需一个查询即可拥有所有内容
db.Manager.aggregate(
[
{
$lookup:
{
from: "Venue",
localField: "localField",
foreignField: "_id",
as: "as"
}
},
]
)
这是问题
第二种方式更适合我,但我不确定该使用哪种方式,您能帮我吗?
答案 0 :(得分:2)
使用第二种方法时,好处是可以执行单个查询并让mongo处理该处理,但是,应事先使用可能的匹配选项限制进入lookup子句的文档。
总体而言,您可以执行一系列操作,因此,在这种情况下,理想情况下,您可以使用以下方法从第一个集合中查找经理ID:
{"$match":{"id" : "5d4f84dd4c35350b284b08ea"}}
,在第二种情况下进行联接。
在联接中,您可能在经理和场所之间具有一对多的关系,因此,如果您可以在查询中注入一些匹配查询以限制所需场所集合中的文档数,那就更好了。 / p>
需要注意的几点
在查找子句中使用"$expr"
时,它不会利用索引进行搜索。
如果场所文档中有很多字段,并且字段很大,则联接查询可能很容易用完内存。 (最好在查询中使用project子句,以将字段限制为您需要的任何内容)