首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从线性mongo集合创建4级嵌套对象聚合输出

从线性mongo集合创建4级嵌套对象聚合输出
EN

Stack Overflow用户
提问于 2020-01-23 18:28:29
回答 1查看 110关注 0票数 0

我有以下模式

代码语言:javascript
复制
{
        question: String,
        answer: Number,
        option1: String,
        option2: String,
        option3: String,
        option4: String,
        subject: String,
        chapter: String,
        topic: String,
        subtopic: String,
        tags: { type: Array, default: [] },
        difficulty: String,
        media: { type: String, default: "" }
}

我想从这个问题模式创建一个索引,其中索引中的唯一条目可以通过元组(主题、章节、主题、子主题)来标识。

代码语言:javascript
复制
{
    "subject": {
        "chapter": {
            "topic": ["subtopics"],
            "topic": ["subtopics"],
        },
        "chapter": {
            "topic": ["subtopics"],
            "topic": ["subtopics"],
        },
    },
    "subject": {
        "chapter": {
            "topic": ["subtopics"],
            "topic": ["subtopics"],
        },
        "chapter": {
            "topic": ["subtopics"],
            "topic": ["subtopics"],
        },
    },
}

为了达到上面的结果,我一直在尝试一些聚合,到目前为止我已经能够达到目的了。

代码语言:javascript
复制
{
    "subject": ["chapters"],
    "subject": ["chapters"],
    "subject": ["chapters"],
    "subject": ["chapters"],
}

跟随管道在猫鼬中的应用

代码语言:javascript
复制
            {
                $group: {
                    _id: "$subject",
                    chapters: { $push: "$chapter" }
                }
            },
            {
                $group: {
                    _id: null,
                    chapters: { $push: { "k": "$_id", "v": "$chapters" } }
                }
            },
            {
                $replaceRoot: { "newRoot": { "$arrayToObject": "$chapters" } }
            }

当我试图扩展上述逻辑以包含主题和子主题时,使用

代码语言:javascript
复制
            {
                $group: {
                    _id: "$subject",
                    chapters: { $push: { "k": "$chapter", "v": { topic: "$topic", subtopic: "$subtopic" } } }
                }
            },
            {
                $group: {
                    _id: null,
                    chapters: { $push: { "k": "$_id", "v": { "$arrayToObject": "$chapters" } } }
                }
            },
            {
                $replaceRoot: { "newRoot": { "$arrayToObject": "$chapters" } }
            }

我得到以下输出

代码语言:javascript
复制
{
    "subject": {
        "chapter": {
            "topic": "value",
            "subtopic": "value"
        },
        "chapter": {
            "topic": "value",
            "subtopic": "value"
        },
    },
    "subject": {
        "chapter": {
            "topic": "value",
            "subtopic": "value"
        },
        "chapter": {
            "topic": "value",
            "subtopic": "value"
        },
    },
}

问题是,章节是最后一个主题和子主题的对象,只有,我知道我在哪里犯了错误,但我不知道如何解决它。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-24 15:51:08

您可以使用这种主要利用$objectToArray的聚合,但是数据重组并不那么优雅:

代码语言:javascript
复制
db.collection.aggregate(
    [
        { 
            "$group" : { 
                "_id" : { 
                    "subject" : "$subject", 
                    "chapter" : "$chapter", 
                    "topic" : "$topic"
                }, 
                "topics" : { 
                    "$push" : "$subtopic"
                }
            }
        }, 
        { 
            "$addFields" : { 
                "topic" : { 
                    "k" : "$_id.topic", 
                    "v" : "$topics"
                }
            }
        }, 
        { 
            "$group" : { 
                "_id" : { 
                    "subject" : "$_id.subject", 
                    "chapter" : "$_id.chapter"
                }, 
                "topics" : { 
                    "$push" : "$topic"
                }
            }
        }, 
        { 
            "$addFields" : { 
                "topics" : { 
                    "$arrayToObject" : "$topics"
                }
            }
        }, 
        { 
            "$addFields" : { 
                "chapters" : [
                    { 
                        "k" : "$_id.chapter", 
                        "v" : "$topics"
                    }
                ]
            }
        }, 
        { 
            "$addFields" : { 
                "chapters" : { 
                    "$arrayToObject" : "$chapters"
                }
            }
        }, 
        { 
            "$group" : { 
                "_id" : null, 
                "subject" : { 
                    "$push" : { 
                        "k" : "$_id.subject", 
                        "v" : "$chapters"
                    }
                }
            }
        }, 
        { 
            "$project" : { 
                "final" : { 
                    "$arrayToObject" : "$subject"
                }
            }
        }, 
        { 
            "$replaceRoot" : { 
                "newRoot" : "$final"
            }
        }
    ]);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59884992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档