我想在一个集合中执行联接,每个集合中的学生名都相同,并且在日志列中“ _” 之后的最后一个字符串是什么变量 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
。
答案 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"
}
])