gpt4 book ai didi

mongodb - 使用 $let 聚合 $lookup 不起作用

转载 作者:行者123 更新时间:2023-12-02 10:49:35 25 4
gpt4 key购买 nike

我在 mongodb 中有一个集合TblStudent,例如

       {
"_id": ObjectId("5baa85041d7859f40d000029"),
"Name": "John Doe",
"RollNo": 12,
"Class": "Ist"
....
}

我有另一个集合TblRoute,例如

   {
"_id": ObjectId("5baa818d1d78594010000029"),
"Name": "New york City",
"StopDetails": [
{
"StopId": "abc777",
"Name": "Block no 3"
},
{
"StopId": "abc888",
"Name": "Block no 4"
}
],
"NumberOfSeats": "10",
"StudentDetails": [
{
"StudentId": ObjectId("5baa85041d7859f40d000029"),
"VehicleId": "7756"
},
{
"StudentId": ObjectId("5baa85f61d7859401000002a"),
"VehicleId": "7676"
}
]
}

我使用的是mongodb 3.6平台。我正在使用下面的代码行

       $query = ['_id' => new MongoDB\BSON\ObjectID($this->id)];
$cursor = $this->db->TblRoute->aggregate([
['$match' => $query],
[
'$lookup' =>
[
'from' => "TblStudent",
'let' => ['StudentId' => '$StudentDetails.StudentId'],
'pipeline' => [
[ '$match' =>
['$expr' =>
['$eq' => ['$StudentId', '$$StudentId' ] ]
]
],
[ '$project' => ['Name' => 1, 'RollNo' => 1 ] ]
],
'as' => "StudentDetails.StudentData"
]
]
]);

我一直在尝试从另一个集合中获取数据,但仅包含某些字段。我正在尝试从 TblStudent 中获取学生姓名和 RollNo 字段TblRoute 是为了使文档数组轻量化。通常,$lookup 阶段从另一个集合中获取所有字段。

我正在尝试上面的代码。它抛出错误消息

"StudentDetails.StudentData" is coming empty 'StudentDetails' => MongoDB\Model\BSONDocument::__set_state(array( 'StudentData' => MongoDB\Model\BSONArray::__set_state(array( )), )), 

但我认为代码写得不正确。实际方法可能有所不同。请帮我解决这个问题。

我希望输出类似于

{
"_id": ObjectId("5baa818d1d78594010000029"),
"Name": "New york City",
"StopDetails": [
.....
],
"StudentDetails": [
{
"StudentId": ObjectId("5baa85041d7859f40d000029"),
"VehicleId": "7756",
"StudentData": [
"Name": ..
"RollNo":...
]
},
{
"StudentId": ObjectId("5baa85f61d7859401000002a"),
"VehicleId": "7676",
"StudentData": [
"Name": ..
"RollNo":...
]
}
]
}

最佳答案

使用以下聚合。

文档注释

User variable names must begin with a lowercase ascii letter [a-z] or a non-ascii character.

因此,将 $let 变量更改为 studentid 并修复了代码中的其他问题。

db.TblRoute.aggregate([
{"$match":ObjectId("5baa818d1d78594010000029")},
{"$lookup":{
"from":"TblStudent",
"let":{"studentid":"$StudentDetails.StudentId"},
"pipeline":[
{"$match":{"$expr":{"$in":["$_id","$$studentid"]}}},
{"$project":{"Name":1,"RollNo":1}}
],
"as":"StudentDetails.StudentData"
}}
])

关于mongodb - 使用 $let 聚合 $lookup 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52708918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com