Node.js MongoDB:$lookup之后嵌套文档上的匹配

Node.js MongoDB:$lookup之后嵌套文档上的匹配,node.js,mongodb,mongoose,aggregate,Node.js,Mongodb,Mongoose,Aggregate,我需要查询链接到作业的时间卡集合,而作业链接到具有特定设施ID的设施。我有以下聚合查询: Timecard.aggregate([ { $match: query }, //some query parameters set before, doesn't matter here { $lookup: { from: 'jobs', as: 'job', localField: 'job',

我需要查询链接到作业的时间卡集合,而作业链接到具有特定设施ID的设施。我有以下聚合查询:

Timecard.aggregate([
    { $match: query }, //some query parameters set before, doesn't matter here
    {
        $lookup: {
            from: 'jobs',
            as: 'job',
            localField: 'job',
            foreignField: '_id'
        }
    },
    { $unwind: '$job' },
    {
        $lookup: {
            from: 'facilities',
            localField: 'job.facilityId'
            foreignField: '_id',
            as: 'job.facilityId'
        }
    },
    { $unwind: '$job.facilityId' },
    { $match: {'job.facilityId._id':'5cad048d95d61a002f5a9edb'}}
];)
在最后一次$match之前,一切都很好,工作被填充到时间卡中,设施被填充到工作中。但由于某种原因,这场比赛并不成功。但是,如果我将facilityId字段添加为

{$addFields: {facilityId: '$job.facilityId._id'}}
并将$match更改为

{$match: 'facilityId':'5cad048d95d61a002f5a9edb'}
然后它就起作用了。
问题是,有没有一种方法可以通过这种方式用点符号查询子文档的字段?

您的最后一行可能需要是ObjectId

{ $match: {'job.facilityId._id': ObjectId('5cad048d95d61a002f5a9edb')}}

明亮的谢谢,我想我以前试过。。。然而,通常的mongoose查询处理的是字符串,而不是ObjectIdfine@Artem-啊,是的,你是对的。mongoose检查您要查询的字段是否是ObjectId,并为您转换它。对于聚合查询,它不这样做(实现这一点非常困难),因此它直接将其传递给mongo而不进行转换。