我有一個聚合查詢,它根據檔案型別回傳具有不同模式的問題陣列。檔案采用以下格式。有些問題可能看起來像這樣
{
"_id": "ID01",
"Description": "1.Any Question?",
"answer": { "option05": "E. " },
"options": {
"option01": "A.",
"option02": "B.",
"option03": "C.",
"option04": "D.",
"option05": "E."
},
"type": "1",
"score": 10
},
一些問題的結構如下
{
"_id": "ID02",
"Description": "Question Description.",
"emq": {
"emq3": {
"answer": "option12",
"explanation": "",
"question": "1 Any Qstn?"
},
"emq4": {
"answer": "option03",
"explanation": "",
"question": "2 Any Qstn?"
},
"emq5": {
"answer": "option06",
"explanation": "",
"question": "3 Any Qstn?"
}
},
"options": {
"option01": "",
"option02": "",
"option03": "",
"option04": "",
},
"type": "2",
"score": 100
},
我使用以下聚合管道來隱藏問題中的答案,(有問題的架構已遷移,我無法更改其結構)
聚合管道
{
$lookup: {
from: 'questions',
let: {
question_id: { $toObjectId: '$qId' },
score: '$score',
},
pipeline: [
{
$match: {
$expr: {
$eq: ['$_id', '$$question_id'],
},
},
},
{
$project: {
answer: {
$cond: {
if: { $eq: ['$type', '1'] },
then: 0,
else: {
$cond: {
if: { $eq: ['$type', '3'] },
then: {
$cond: {
if: {
emq: {
regex: /^emq\d $/,
},
},
then: 0,
else: 1,
},
},
else: 1,
},
},
},
},
Description: 1,
options: 1,
type: 1,
emq: 1,
score: 1,
},
},
}
它適用于型別 1 的問題,但不幸的是我無法隱藏型別 2 的答案,因為它們不僅在 'emq' 物件中,而且在嵌套的 'emq3' 物件中,字串末尾帶有動態數字' emq',我應用了正則運算式,但不知何故我無法在 emq3 物件中投影答案,無論如何要實作以下結果,從而隱藏像這樣的兩個問題的答案
{
"_id": "ID01",
"Description": "1.Any Question?",
"options": {
"option01": "A.",
"option02": "B.",
"option03": "C.",
"option04": "D.",
"option05": "E."
},
"type": "1",
"score": 10
},
{
"_id": "ID02",
"Description": "Question Description.",
"emq": {
"emq3": {
"question": "1 Any Qstn?"
},
"emq4": {
"question": "2 Any Qstn?"
},
"emq5": {
"question": "3 Any Qstn?"
}
},
"options": {
"option01": "",
"option02": "",
"option03": "",
"option04": "",
},
"type": "2",
"score": 100
},
uj5u.com熱心網友回復:
您可以在聚合管道中執行以下操作:
- 使用將物件
emq轉換為 kv 元組陣列$objectToArray $project洗掉該欄位answer和explanationconvert the arrayemq` 回傳物件
db.collection.aggregate([
{
"$addFields": {
"emq": {
"$objectToArray": "$emq"
}
}
},
{
"$project": {
"emq.v.answer": false,
"emq.v.explanation": false,
"answer": false
}
},
{
"$addFields": {
"emq": {
"$arrayToObject": "$emq"
}
}
},
{
"$addFields": {
emq: {
"$cond": {
"if": {
$eq: [
"$emq",
null
]
},
"then": "$$REMOVE",
"else": "$emq"
}
}
}
}
])
這是Mongo 游樂場供您參考。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/350923.html
