Node.js MongoDB:$lookup之后嵌套文档上的匹配
我需要查询链接到作业的时间卡集合,而作业链接到具有特定设施ID的设施。我有以下聚合查询: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',
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而不进行转换。