【问题标题】:MongoDB: $match on a nested document after $lookupMongoDB:$lookup 后嵌套文档上的 $match
【发布时间】:2020-12-29 03:30:16
【问题描述】:

我需要查询与作业相关联的时间卡集合,而作业与具有特定设施 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'}

然后就可以了。 问题是,有没有办法以这种方式用点符号查询子文档的字段?

【问题讨论】:

    标签: node.js mongodb mongoose aggregate


    【解决方案1】:

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

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

    【讨论】:

    • 太棒了!谢谢,我以为我之前尝试过...但是,通常的猫鼬查询处理字符串而不是 ObjectId 就好了
    • @Artem - 啊,是的,你是对的。 mongoose 检查您查询的字段是否为 ObjectId 并为您转换。对于聚合查询,它不会这样做(实现起来非常困难),所以它只是将它直接传递给 mongo 而不进行转换。
    猜你喜欢
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2020-11-26
    • 2020-12-31
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多