mongo 两个集合联合查询,查询条件两个集合都有字段参与,怎么写?
在MongoDB中,可以使用聚合管道的方式对多个集合进行联合查询。
假设有两个集合A和B,它们都有一个字段field1,在聚合管道中可以使用$lookup和$match操作符将这两个集合连接起来,并且匹配条件是field1相等:
db.A.aggregate([
{
$lookup:
{
from: "B",
localField: "field1",
foreignField: "field1",
as: "matching_docs"
}
},
{
$match:
{
"matching_docs": {$ne: []}
// 这里可以加入其它的查询条件
}
}
])
这样就可以得到一个包含两个集合中满足条件的文档的结果集。其中$lookup用于与另一个集合建立连接,$match用于过滤掉没有匹配的文档。如果需要添加更多的查询条件,可以在$match操作中添加。
两个集合A和B都有一个字段uid, A有aid,B有name,我需要查询 aid=1,name 以abc开头的字符串
可以使用聚合管道的方式来对两个集合进行联合查询,同时加入多个匹配条件,例如:
db.A.aggregate([
{
$match: {aid: 1}
},
{
$lookup:
{
from: "B",
let: {uid_a: "$uid"},
pipeline: [
{
$match:
{
$expr:
{
$and:
[
{$eq: ["$name", /^abc/]},
{$eq: ["$uid", "$$uid_a"]}
]
}
}
}
],
as: "matching_docs"
}
},
{
$unwind: "$matching_docs"
},
{
$project:
{
_id: 0,
uid: 1,
aid: 1,
name: "$matching_docs.name"
}
}
])
上述聚合操作首先在集合A中过滤出aid=1的文档,然后使用$lookup操作符连接集合B,并在pipeline中指定多个匹配条件,包括name以"abc"开头和uid相等。最后使用$unwind操作解构匹配结果并使用$project操作投影出需要的字段。
需要注意的是,$lookup操作中使用的let和pipeline参数可以将外部文档的字段值传递到内部查询中,使得两个集合的字段可以进行比较。