我从模式中的嵌套值中获取一个id,然后使用它从另一个表中查找该id,并匹配该表中的几个日期。我尝试过常规的匹配/查找/展开/匹配,以及查找/让/管道技术。在这两种情况下,由于某种原因,它都会忽略日期上的匹配。我错过了什么?
这里有一种方法可供参考。我也不确定该把排序放在哪里,因为它似乎不会把$meeting拉出来排序。
示例记录
PRODUCT
{
"_id" : ObjectId("5f36c0df6d5553e6af208cac"),
"items" : [
{
"paramType" : "Meeting",
"paramValue" : "5f36c0df6d5553e6af208cab"
}
],
"ownerId" : ObjectId("12345678901234567")
}
MEETING
{
"_id" : ObjectId("5f36c0df6d5553e6af208cab"),
"startDate" : ISODate("2020-08-18T10:00:00.000+0000"),
"endDate" : ISODate("2020-08-18T11:00:00.000+0000")
}
骨料
db.getCollection("products").aggregate(
[
{
$match: {
"ownerId": ObjectId("12345678901234567")
}
},
{
$unwind: "$items"
},
{
$lookup: {
from: "meetings",
let: { "meetingId": '$items.paramValue' },
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ["$_id", "$$meetingId"] },
{
$eq: ["meeting.startDate", {
"$gte": ["$meeting.startDate", ISODate("2020-08-01T00:00:00.000Z")]
}]
},
{
$eq: ["meeting.endDate", {
"$lte": ["$meeting.endDate", ISODate("2020-08-31T23:59:59.999Z")]
}]
}
],
},
},
},
],
as: "meeting"
}
},
{
$unwind: "$meeting"
},
{
$project: {
"_id": 1,
"items": 1,
"meeting": "$meeting"
}
},
{
$sort: {
'meeting.startDate': 1
}
},
]
);
这可能是因为item.paramValue
在查找之前未转换为ObjectId。但无法找出如何在聚合中转换它。我试过这个,但没有去
{
$addFields: {
"convertedMeetingId": { $toObjectId: "$items.paramValue" }
}}
let: { "meetingId": "$convertedMeetingId" }
$lookup
中有快速修复程序其他看起来不错,
let
您可以在此处使用$toObjectId
将meetingId
字符串转换为ObjectId
$gte
和$lte
,您使用了$meeting.startDate
和$meeting.endDate
,它应该是$startDate
和$endDate
,因为您已经在meeting
查找中了- 我不知道你为什么使用$eq,对于
$gte
和$lte
,如果我没有错,我已经更正并删除了$eq
{
$lookup: {
from: "meetings",
let: { meetingId: { $toObjectId: "$items.paramValue" } },
pipeline: [
{
$match: {
$expr: {
$and: [
{ $eq: ["$_id", "$$meetingId"] },
{ $gte: ["$startDate", ISODate("2020-08-01T00:00:00.000Z")] },
{ $lte: ["$endDate", ISODate("2020-08-31T23:59:59.999Z")] }
]
}
}
}
],
as: "meeting"
}
},
游乐场