检查$ project中是否找到子文档

时间:2018-03-22 17:44:25

标签: node.js mongodb mongoose aggregation-framework

我试图找到公司提供的所有行程,按公交车司机分组,并检查一名乘客是否参加了行程。

Content是一个可以引用多个模型的数组:User,Cargo等。

我可以使用以下方式实现我想要的结果:

    traveled: { $in: [ passengerId, "$content.item" ] },

但我想确认匹配的ID确实是“用户”(乘客)。我试过了:

    traveled: { $and: [
        { $in: [ passengerId, "$content.item" ] },
        { $in: [ `Passenger`, "$content.kind" ] },
   ]},

但如果传递的id有一种' Cargo'当有另一个内容有一个'用户'在数组内部。

    // Trip
    const schema = Schema({
        company: { type: Schema.Types.ObjectId, ref: 'Company', required: false },
        driver: { type: Schema.Types.ObjectId, ref: 'User', required: true },
        description: { type: String, required: true },
        ....
        content: [{
            kind: { type: String, required: true },
            item: { type: Schema.Types.ObjectId, refPath: 'content.kind', required: true }
        }]
    });

    const Trip = mongoose.model('Trip', schema, 'trips');

    Trip.aggregate([
        { $match: { company: companyId } },
        {
            $project: {
                _id: 1,
                driver: 1,
                description: 1,
                traveled: { $in: [ passengerId, "$content.item" ] },
                // traveled: { $and: [
                //     { $in: [ passengerId, "$content.item" ] },
                //     { $in: [ `Passenger`, "$content.kind" ] },
                // ]},
            }
        },
        {
            $group : {
                _id: "$driver",
                content: {
                    $push: {
                        _id: "$_id",
                        description: "$description",
                        traveled: "$traveled",
                    }
                }
            },
        }
    ]).then(console.log).catch(console.log);

1 个答案:

答案 0 :(得分:1)

[2, 4, 3, 1] [1, 2, 3, 4] 阶段有no $elemMatch operator。因此,要使用模仿类似功能,您可以创建$project $filter$size> 0

这样的东西
$gt