我有兩個 mongoDB 查詢,一個是聚合的,另一個是查找的。它們的編碼方式是,如果“聚合”查詢給出結果,則“查找”查詢不運行,否則,如果“聚合”沒有給出結果,則查找查詢運行。通過以下方式:-
var pipeline1 = [{
$match: { "user_id": "123" } //dynamic value based on request
}, {
$lookup: {
from: "config_rules",
localField: "group_id",
foreignField: "rule_type_value", //this field has group id mapped || or can be null
as: "rule"
}
},
{
$unwind: "$rule"
},{
$match:{ "rule.configtype": "profile" } //dynamic value based on request
}];
db.getCollection("user_group_mapping").aggregate(pipeline);
如果上述聚合給出結果,則回傳相同的結果。否則我們運行以下查找查詢來獲取普通用戶的配置規則,并回傳它
var query = {
$and: [
{ rule_type_value: null }, //null for general user rules
{ configtype: "profile" }
]
}
db.getCollection("config_rules").find(query)
簡單來說,對于一個請求,我們檢查請求者是否在一個組中,如果是,則根據該組回傳配置規則,如果請求者不在任何組中,則回傳通用配置規則。
所以我的查詢如上所示,這是在不同集合上運行的兩個不同查詢,需要兩個單獨的 mongo 呼叫。我可以以某種方式將這些查詢組合成 1 個查詢嗎?例如,如果對于給定的用戶,他在一個組中,則回傳特定于組的配置或回傳一般配置規則。
我想將這些組合起來,以便在我的代碼中只需要進行一次資料庫呼叫(此資料庫呼叫本身將兩個查詢合并為一個)而不是兩次。
user_group_mapping 集合中的示例檔案
{ "user_id": "123",
"group_id": "beta_users"
},
{ "user_id": "213",
"group_id": "alpha_testers";
}
config_rules 中的示例資料:
{ "rule_type_value":"beta_users",
"configType": "help",
"configVersion": "1.1"
},
{ "rule_type_value":null,
"configType": "help",
"configVersion": "1.0"
},
{ "rule_type_value":"alpha_testers",
"configType": "help",
"configVersion": "1.3"
}
樣本輸入:
請求 1 user_id:“123” configType:“幫助”
請求 2 user_id:“678” configType:“幫助”
示例輸出:(為簡單起見,我只寫了規則內容)
將回傳 Req 1 config v1.1
{ "rule_type_value":"beta_users",
"configType": "help",
"configVersion": "1.1"
}
將回傳 Req 2 v1.0
{ "rule_type_value":null,
"configType": "help",
"configVersion": "1.0"
}
uj5u.com熱心網友回復:
嘗試:
https://mongoplayground.net/p/m3HxBQIuqpS
- 請
configType在第 23user_id行設定并在第 31行設定
db.config_rules.aggregate([
{
$lookup: {
from: "user_group_mapping",
localField: "rule_type_value",
foreignField: "group_id",
as: "rule"
}
},
{
$addFields: {
"ruleCount": {
$size: "$rule",
},
"user_id": {
$first: "$rule.user_id"
}
}
},
{
$match: {
"configType": "help"
}
},
{
$match: {
$or: [
{
user_id: {
$eq: "678"//123 or 678
}
},
{
user_id: {
$exists: false
}
}
]
}
},
{
$sort: {
"ruleCount": -1
}
},
{
$limit: 1
},
{
$project: {
"_id": 0,
"rule_type_value": 1,
"configType": 1,
"configVersion": 1
}
}
])
uj5u.com熱心網友回復:
MongoDB 聚合沒有流控,如果一個階段沒有檔案輸出,它不會執行后續階段。
如果要從鏈接集合中檢索 2 個可能值中的 1 個,請更改$lookup階段以選擇所有潛在檔案,然后過濾回傳的串列。也許類似于:
[
{$match: { "user_id": "123" }},
{$lookup: {
from: "config_rules",
let: {targetgroup: "$group_id"},
pipeline: [{$match:{
configtype: "profile",
$or:[
{$expr:{$eq:["$rule_type_value","$$targetgroup"]}},
{ rule_type_value: null, }
]
}}],
as: "rule"
}},
{$set: {
rule: {$cond: {
if: {$in: ["$group_id", "$rule.rule_type_value"]},
then: {$filter: {
input: "$rule",
cond: {$eq: ["$group_id", "$$this.rule_type_value"]}
}},
else: "$rule"
}},
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/420749.html
標籤:
