仅在WHERE子字符串匹配的集合上执行联接

时间:2018-11-27 20:47:13

标签: arrays mongodb mongoose mongodb-query aggregation-framework

我想在一个集合中执行联接,每个集合中的学生名都相同,并且在日志列中“ _” 之后的最后一个字符串是什么变量 id 是。

我已加入工作,但问题在match语句上。如何与要加入的集合中 logs 列上的字符串的子字符串匹配?

我可以将日志列值拆分成这样的数组:

{ $split: [ "$studentInfo.log", "_" ]}

我现在只需要获取下划线后的最后一个值即可匹配变量 id

var id = "123";

dbo.collection("student").aggregate([
{ "$lookup": {
    "localField": "name",
    "from": "data",
    "foreignField": "data.studentName",
    "as": "studentInfo"
}
}]).toArray(function(err, results) {
    console.log(results);
});

问题在于学生姓名不是唯一的,因此为了使联接正常工作,我们需要按名称联接,并确保下划线后的字符与我们具有 id 的变量匹配/ p>

学生收藏

{
    "_id" : ObjectId("(Object ID here"),
    "name": "Test"
}

数据收集

{
    "_id" : ObjectId("(Object ID here"),
    "studentName": "Test",
    "log": "NC_Test_123"
},
{
    "_id" : ObjectId("(Object ID here"),
    "studentName": "Test",
    "log": "FC_Test_444"
}

当我具有id的变量为123时,我需要获取NC_Test_123

1 个答案:

答案 0 :(得分:1)

您需要同时使用以下两个条件定义自定义lookup condition:学生姓名和log字段。要获取分割后的字符串的最后一个值,可以使用索引设置为-1的{​​{3}}

db.student.aggregate([
    {
        $lookup: {
            from: "data",
            let: { "student_name": "$name" },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $and: [
                                { $eq: [ "$$student_name", "$studentName" ] },
                                { $eq: [ { $arrayElemAt: [ { $split: [ "$log", "_" ]}, -1 ] }, "123" ] }
                            ]
                        }
                    }
                }
            ],
            as: "studentInfo"
        }
    },
    {
        $unwind: "$studentInfo"
    }
])