[英]How to query mongo with multiple db ref relations
假設我有以下數據庫結構我有用戶集合
"users": [
{
"_id": "4775222e-8e4f-4f84-8dba-b097291bbd39",
"surname": "Smith",
"forename": "John"
}
]
我有job_requests集合,它在 1 個字段中引用了用戶集合,如下所示:
"job_requests": [
{
"_id": "f4bdda3e-0e8d-4e8d-b070-7d01421f5a51",
"description": "do something",
"riskManager": {
"$ref": "users",
"$id": "4775222e-8e4f-4f84-8dba-b097291bbd39"
}
}
]
最后我有一個工作集合,它在 1 個字段中引用了job_requests集合:
"jobs": [
{
"_id": "someID",
"description": "do something",
"jobRequest": {
"$ref": "job_requests",
"$id": "f4bdda3e-0e8d-4e8d-b070-7d01421f5a51"
}
}
]
我需要一個查詢,該查詢將按 userId 返回所有作業,這意味着我需要找到該用戶的所有 job_requests,然后找到具有這些 job_requests 的所有作業。 我嘗試在MongoPlayground上使用 mongo 聚合,這有效但僅適用於 mongo 4.4.1
db.jobs.aggregate([
{
"$lookup": {
"from": "job_requests",
"localField": "jobRequest.$id",
"foreignField": "_id",
"as": "jobRequest"
}
},
{
"$unwind": "$jobRequest"
},
{
"$match": {
"jobRequest.riskManager.$id": "4775222e-8e4f-4f84-8dba-b097291bbd39"
}
}
])
並給我正確的結果。 問題是我的服務器是 4.2.8,在那個版本上這會產生錯誤“FieldPath 字段名稱可能不以 '$' 開頭。” 如何進行查詢,使其不會在 4.2.8 上中斷? 我無法重組數據,我需要擁有集合之間的所有這些關系。 我可能會補充說,在此之上的后端是 spring 數據 mongodb,所以我可以使用這些功能來構造查詢,但我想它歸結為 mongo QL 的 javascript。
作為建議在這個博客中也可以使用$ objectToArray,$ arrayElemAt和$ addFields運營商來完成。
所以它變得像
db.jobs.aggregate([
{
"$addFields": {
"jobRequest": {
"$arrayElemAt": [
{
"$objectToArray": "$jobRequest"
},
1
]
}
}
},
{
"$addFields": {
"jobRequest": "$jobRequest.v"
}
},
{
"$lookup": {
"from": "job_requests",
"localField": "jobRequest",
"foreignField": "_id",
"as": "jobRequest"
}
},
{
"$addFields": {
"jobRequest": {
"$arrayElemAt": [
"$jobRequest",
0
]
}
}
},
{
"$unwind": "$jobRequest"
},
{
"$match": {
"jobRequest.riskManager.$id": "4775222e-8e4f-4f84-8dba-b097291bbd39"
}
}
])
使用 mongo 時不惜一切代價避免 DbRef。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.