這是“路線”檔案的示例
[{
routes: [{
driver_id: "61e9536f142f337c96883c52",
route_id:"SRT006",
payment:13.2
}, {
driver_id: "61e9536f142f337c96800a56",
route_id:"SRT005",
payment:15
}, {
route_id:"SRT004",
payment:20
}],
apartment: 'abc apartment',
deliverydate: "06/03/2022"
}]
這是“用戶”檔案的示例
[
{
_id: ObjectId(61e9536f142f337c96883c52),
name: 'John',
phone: (222) 123-4568
},
{
_id: ObjectId(61e9536f142f337c96800a56),
name: 'Bob',
phone: (200) 123-4568
}
]
最終結果應該是這樣的
[{
routes: [{
driver_id: "61e9536f142f337c96883c52",
driver_name: 'John',
route_id:"SRT006",
payment:13.2
}, {
driver_id: "61e9536f142f337c96800a56",
driver_name: 'Bob',
route_id:"SRT005",
payment:15
}, {
route_id:"SRT004",
payment:20
}],
apartment: 'abc apartment',
deliverydate: "06/03/2022"
}]
我試過 $lookup 來添加 driver_name 但出現錯誤。關于在 MongoDB 上獲得上述結果的方法有什么建議?
uj5u.com熱心網友回復:
$lookup-集合通過管道routes與集合連接。users1.1。
$in- 過濾檔案_id(轉換為string型別)在routes_driver_id陣列中。1.2. - 裝飾要在陣列
$project中回傳的輸出檔案。driver$set- 設定routes欄位。2.1。
$map- 迭代routes陣列中的每個元素并回傳一個新陣列。2.1.1。
$mergeObjects- 將當前迭代檔案與結果2.1.1.1合并。2.1.1.1。- 從2.1.1.1.1
$first獲取陣列的第一個值。2.1.1.1.1。- 通過將 current與(轉換為型別)匹配來過濾
$filter檔案。driverroute_iddriver_idstring$unset- 洗掉driver欄位。
db.routes.aggregate([
{
"$lookup": {
"from": "users",
"as": "driver",
"let": {
routes_driver_id: "$routes.driver_id"
},
"pipeline": [
{
$match: {
$expr: {
$in: [
{
$toString: "$_id"
},
"$$routes_driver_id"
]
}
}
},
{
$project: {
_id: 0,
driver_id: "$_id",
name: 1
}
}
]
}
},
{
$set: {
routes: {
$map: {
input: "$routes",
as: "route",
in: {
$mergeObjects: [
"$$route",
{
$first: {
$filter: {
input: "$driver",
cond: {
$eq: [
"$$route.driver_id",
{
$toString: "$$this.driver_id"
}
]
}
}
}
}
]
}
}
}
}
},
{
$unset: "driver"
}
])
演示@Mongo Playground
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/503997.html
