我有一个聚合查询,它根据文档的类型返回具有不同架构的问题数组。这些文件的格式如下。有些问题可能是这样的
{
"_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‘的末尾有动态数字,我应用了regex,但不知怎么的,我无法在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
},发布于 2021-11-05 05:25:19
您可以在聚合管道中执行以下操作:
emq将对象$objectToArray转换为k-v元组数组。$project以移除字段answer和explanationconvert the array emq`‘回到对象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"
}
}
}
}
])这是供您参考的蒙戈游乐场。
https://stackoverflow.com/questions/69848736
复制相似问题