【发布时间】:2021-03-22 19:51:36
【问题描述】:
我正在尝试实现一个将两个集合合并为一个的查询,这可以使用$lookup 来完成。我想要实现的是,如果localField 与foreignField 不匹配,我希望也包含该记录。这是可能的还是我错过了什么?以下是我迄今为止尝试过的基本$lookup 聚合:
const billPayments = await BillPayment.aggregate([
{
$match: {
isActive: true,
},
},
{
$lookup: {
from: PackageList.collection.name,
localField: "serviceNumber",
foreignField: "serviceNumber",
as: "package",
},
},
{ $unwind: "$package" },
{
$project: {
serviceNumber: 1,
amount: 1,
isCaution: 1,
paymentDate: 1,
remark: 1,
package: "$package",
id: "$_id",
},
},
]);
res.json(billPayments);
billPayments 的当前结果仅适用于两个集合中存在serviceNumber 的那些BillPayment 数据。但我希望将PackageList 中不存在的那些记录也包括在内。我怎样才能做到这一点?
我很确定我在这里遗漏了一些东西。任何帮助表示赞赏。
#编辑预期输出
"billPayments": [
{
"amount": 299.25,
"id": "604f5bbd6bf57e1f9c58203f",
"isActive": true,
"isCaution": false,
"packageService": {
"_id": "5fc4a5e15ce5bf227451f4b8",
"isActive": true,
"serviceType": "Post_Paid",
"moneyLimit": 3000
},
"employee": {
// Employee data from Employee collection to be included
}
"paymentDate": "2021-03-14T21:00:00.000Z",
"remark": "",
"serviceNumber": "0935998681"
},
{
"amount": 299.25,
"id": "604f5bbd6bf57e1f9c58203f",
"isActive": true,
"packageService": {
// If there is no match for serviceNumber
},
"paymentDate": "2021-03-14T21:00:00.000Z",
"remark": "",
"serviceNumber": "0735448621"
}
]
编辑其他$lookup 查询:
我有第二级$lookup 可以从另一个集合中获取更多信息。如下所示:
{
$lookup: {
from: PackageList.collection.name,
localField: "serviceNumber",
foreignField: "serviceNumber",
as: "package",
},
},
{ $unwind: "$package" },
{
$lookup: {
from: Employee.collection.name,
localField: "package.employee",
foreignField: "_id",
as: "employee",
},
},
正如@DheemanthBhat 在他的回答中所建议的那样,我尝试从Package 中删除unwind,并且可以轻松获得一个空列表。但是,如果我尝试在Package 上使用$lookup 来获取员工信息,则会抛出MongoError,因为它无法查找空对象。
有没有什么方法可以从第二级$lookup 跳过那些empty 包?或者在这种情况下如何使用$ifNull 来跳过空结果中的$unwind?
【问题讨论】:
-
为什么不直接将 $merge 合并到其中一个集合中?
-
@Yahya 你能告诉我怎么做吗?我对 mongoDb 很陌生
-
如果你给我看示例文件,我应该可以整理一些东西
-
@Kirubel 还包括预期的输出。
-
@DheemanthBhat 我已经用预期的示例输出编辑了我的问题
标签: mongodb mongoose mongodb-query