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

问题描述

我要从架构中的嵌套值中获取一个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")
}

AGGREGATE

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" }

解决方法

na中的其他一些快速修复看起来不错,

  • $lookup,您可以在此处使用letmeetingId字符串转换为ObjectId
  • $toObjectId$gte,您分别使用了$lte$meeting.startDate,因为您已经在{{1 }}查找。
  • 我不确定您为什么使用$ eq并与$meeting.endDate$startDate一起使用,如果我没记错,我已经更正并删除了$ eq,它将直接运行。
$endDate

Playground