如何在MongoDB查找中转换为ObjectId并匹配日期



我从模式中的嵌套值中获取一个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您可以在此处使用$toObjectIdmeetingId字符串转换为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"
}
},

游乐场

最新更新