Выполнять объединение только для коллекции, ГДЕ совпадает подстрока - PullRequest
0 голосов
/ 27 ноября 2018

Я хотел бы выполнить объединение в коллекцию, где имя студента равно в каждой коллекции И ГДЕ последняя строка после "_" в столбце значение журнала равно переменной id is.

Я получил соединение, чтобы работать, но проблема в заявлении о совпадении.Как можно сопоставить подстроку строки в столбце 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

коллекция учеников

{
    "_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"
}

Мне нужно получить NC_Test_123, когда переменная, которую я имею для id, равна 123.

1 Ответ

0 голосов
/ 28 ноября 2018

Вам необходимо определить пользовательское условие поиска с обоими условиями: имя студента и поле log.Чтобы получить последнее значение разделенной строки, вы можете использовать $ arrayElemAt с индексом, установленным в -1

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"
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...