我从架构中的嵌套值中获取一个ID,然后使用该ID从另一个表中查找该ID,并在该表中的几个日期上进行匹配。我尝试了常规的match / lookup / unwind / match以及lookup / let / pipeline技术。在这两种情况下,由于某种原因,它都会忽略日期匹配。我想念什么?
这是一种参考方法。我也不知道该放在哪儿,因为它似乎并没有拉出$ 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
您可以使用以下方式将meetingId
字符串转换为ObjectId
此处$toObjectId
$gte
和$lte
,您曾经使用过$meeting.startDate
,$meeting.endDate
它应该是$startDate
,$endDate
因为您已经在内部meeting
查询中。$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"
}
},
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句