我在 MongoDB 4.0 (pymongo) 中有三個集合
users: [
{name: "John", user_type: "client", society: 1},
{name: "Charles", user_type: "client", society: 1},
{name: "Jessy", user_type: "provider", society: 1},
{name: "Tim", user_type: "provider", society: 2}
]
clients: [
{_id: 1, name: "Client1"}
]
providers: [
{_id: 1, name: "Provider1"},
{_id: 2, name: "Provider2"}
]
我需要根據user_type值在用戶和客戶或提供者之間進行連接,并將其設定為結果中的相同鍵值。
例如,結果將是:
user : {name: "John", user_type: "client", society: 1, complete_society: {_id: 1, name: "Client1"}}
or
user : {name: "Tim", user_type: "provider", society: 2, complete_society: {_id: 2, name: "Provider2"}}
我現在唯一的解決方案是$lookup在兩個不同的鍵中執行兩個不同的操作,然后在請求后重新處理結果
db.users.aggregate([{
"$lookup": {
"from": "clients",
"localField": "society",
"foreignField": "_id",
"as": "client"
}
},
{"$unwind": "$clients"},{
"$lookup": {
"from": "providers",
"localField": "society",
"foreignField": "_id",
"as": "provider"
}
},
{"$unwind": "$providers"}]);
然后執行 forEach 并設定一個鍵complete_society并洗掉以前的鍵。這不是完美的方式,也許在 mongo 中,存在可以做到這一點的方法。
uj5u.com熱心網友回復:
您可以按照以下更改查詢以達到預期的結果,
- 移除
$unwind階段 $project顯示必填欄位$arrayElemAt從查找結果中獲取第一個元素$cond檢查user_type是“客戶端”然后回傳client陣列否則回傳provider陣列
db.users.aggregate([
{
$lookup: {
from: "clients",
localField: "society",
foreignField: "_id",
as: "client"
}
},
{
$lookup: {
from: "providers",
localField: "society",
foreignField: "_id",
as: "provider"
}
},
{
$project: {
name: 1,
society: 1,
user_type: 1,
complete_society: {
$arrayElemAt: [
{
$cond: [{ $eq: ["$user_type", "client"] }, "$client", "$provider"]
},
0
]
}
}
}
])
操場
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326159.html
