如何在MongoDb中查询嵌入式文档?

如何在MongoDb中查询嵌入式文档?,mongodb,mongodb-query,Mongodb,Mongodb Query,我的文档在MongoDB中包含了将近七个级别的文档,现在我需要编写一个查询来检查所有条件,比如,subject=java,topic=oops,level=l1,complexity=easy,questionType=mcq,根据这个要求显示集合中的所有问题。 任何人请帮助我,提前谢谢 { "_id" : ObjectId("59f71b4d0bec333e1707a8d3"), "_class" : "com.wipro.domain.QuestionBank", "

我的文档在MongoDB中包含了将近七个级别的文档,现在我需要编写一个查询来检查所有条件,比如,
subject=java,topic=oops,level=l1,complexity=easy,questionType=mcq
,根据这个要求显示集合中的所有问题。 任何人请帮助我,提前谢谢

{
    "_id" : ObjectId("59f71b4d0bec333e1707a8d3"),
    "_class" : "com.wipro.domain.QuestionBank",
    "subjectLists" : [ 
        {
            "subject" : "java",
            "topicList" : [ 
                {
                    "topic" : "oops",
                    "levelList" : [ 
                        {
                            "level" : "l1",
                            "complexityList" : [ 
                                {
                                    "complexity" : "easy",
                                    "questionTypeList" : [ 
                                        {
                                            "questionType" : "mcq",
                                            "questionList" : [ 
                                                {
                                                    "_id" : "2",
                                                    "question" : "2st question",
                                                    "options" : [ 
                                                        {
                                                            "a" : "1",
                                                            "b" : "2",
                                                            "c" : "3",
                                                            "d" : "4"
                                                        }
                                                    ],
                                                    "correctAnswer" : "b",
                                                    "marksAlloted" : "1"
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}


{
    "_id" : ObjectId("59f71b700bec333e1707a8d4"),
    "_class" : "com.wipro.domain.QuestionBank",
    "subjectLists" : [ 
        {
            "subject" : "java",
            "topicList" : [ 
                {
                    "topic" : "threds",
                    "levelList" : [ 
                        {
                            "level" : "l3",
                            "complexityList" : [ 
                                {
                                    "complexity" : "hard",
                                    "questionTypeList" : [ 
                                        {
                                            "questionType" : "mcq",
                                            "questionList" : [ 
                                                {
                                                    "_id" : "3",
                                                    "question" : "3rd question",
                                                    "options" : [ 
                                                        {
                                                            "a" : "1",
                                                            "b" : "2",
                                                            "c" : "3",
                                                            "d" : "4"
                                                        }
                                                    ],
                                                    "correctAnswer" : "b",
                                                    "marksAlloted" : "1"
                                                }
                                            ]
                                        }
                                    ]
                                }
                            ]
                        }
                    ]
                }
            ]
        }
    ]
}

以下带投影的查询仅列出问题:

注意:请在下面传递您的查询:

db.questions.findOne({}, {'subjectLists.topicList.levelList.complexityList.questionTypeList.questionList':1})

以下带投影的查询仅列出问题:

注意:请在下面传递您的查询:

db.questions.findOne({}, {'subjectLists.topicList.levelList.complexityList.questionTypeList.questionList':1})

你可以试试这个脚本

db.getCollection('document').aggregate([
{
    $match:{
        $and: [
            {"subjectLists.subject": "java"}
            ,{"subjectLists.topicList.topic": "oops"}
            ,{"subjectLists.topicList.levelList.level": "l1"}
            ,{"subjectLists.topicList.levelList.complexityList.complexity": "easy"}
            ,{"subjectLists.topicList.levelList.complexityList.questionTypeList.questionType": "mcq"}
        ]       
    }    
},
{
    $unwind: "$subjectLists"
}
,{
    $unwind: "$subjectLists.topicList"
}
,{
    $unwind: "$subjectLists.topicList.levelList"
}
,{
    $unwind: "$subjectLists.topicList.levelList.complexityList"
}
,{
    $unwind: "$subjectLists.topicList.levelList.complexityList.questionTypeList"
}
,{
    $unwind: "$subjectLists.topicList.levelList.complexityList.questionTypeList.questionList"
},
{
    $project: {
        "questionList":  "$subjectLists.topicList.levelList.complexityList.questionTypeList.questionList"
    }   
}
,
{
        $replaceRoot: { newRoot: "$questionList" }
}
])
结果:

{
    "_id" : "2",
    "question" : "2st question",
    "options" : [ 
        {
            "a" : "1",
            "b" : "2",
            "c" : "3",
            "d" : "4"
        }
    ],
    "correctAnswer" : "b",
    "marksAlloted" : "1"
}

你可以试试这个脚本

db.getCollection('document').aggregate([
{
    $match:{
        $and: [
            {"subjectLists.subject": "java"}
            ,{"subjectLists.topicList.topic": "oops"}
            ,{"subjectLists.topicList.levelList.level": "l1"}
            ,{"subjectLists.topicList.levelList.complexityList.complexity": "easy"}
            ,{"subjectLists.topicList.levelList.complexityList.questionTypeList.questionType": "mcq"}
        ]       
    }    
},
{
    $unwind: "$subjectLists"
}
,{
    $unwind: "$subjectLists.topicList"
}
,{
    $unwind: "$subjectLists.topicList.levelList"
}
,{
    $unwind: "$subjectLists.topicList.levelList.complexityList"
}
,{
    $unwind: "$subjectLists.topicList.levelList.complexityList.questionTypeList"
}
,{
    $unwind: "$subjectLists.topicList.levelList.complexityList.questionTypeList.questionList"
},
{
    $project: {
        "questionList":  "$subjectLists.topicList.levelList.complexityList.questionTypeList.questionList"
    }   
}
,
{
        $replaceRoot: { newRoot: "$questionList" }
}
])
结果:

{
    "_id" : "2",
    "question" : "2st question",
    "options" : [ 
        {
            "a" : "1",
            "b" : "2",
            "c" : "3",
            "d" : "4"
        }
    ],
    "correctAnswer" : "b",
    "marksAlloted" : "1"
}

您希望得到什么样的输出/查询?您需要什么样的查询?您只需调用
db.collection.find({“subjectlist.subject”:“java”},{“subjectlist.topicList.levelList.complexityList.questionTypeList.questionList”:1})
即可返回所有匹配
subject=java
subject=java,topic=oops,level=l1,complexity=easy,questionType=mcq基于此要求显示集合中的所有问题。您希望得到什么输出/查询?按您需要的查询?您只需调用
db.collection.find({“subjectlist.subject”:“java”},{“subjectlist.topicList.levelList.complexityList.questionTypeList.questionList”:1})
即可返回所有匹配
subject=java
subject=java,topic=oops,level=l1,complexity=easy,基于此要求的questionType=mcq显示集合中的所有问题。subject=java,topic=oops,level=l1,complexity=easy,questionType=mcq基于此要求显示集合中的所有问题。我进行了更新。我正在尝试运行该脚本,但遇到此错误,“errmsg”:异常:无法识别的管道阶段名称:“$replaceRoot”“,您的mongodb版本是什么$replaceRoot随3.4版而来。删除此部分并重试。是的,以前我的mongo版本3.2现在我升级了,它工作得很好。非常感谢。subject=java,topic=oops,level=l1,complexity=easy,questionType=mcq基于此要求显示集合中的所有问题。我进行了更新。我正在尝试运行该脚本,但收到错误“errmsg”:“异常:无法识别的管道阶段名称:'$replaceRoot',您的mongodb版本是什么$replaceRoot随3.4版而来。删除此部分并重试。是的,以前我的mongo版本3.2现在我升级了,它工作得很好。非常感谢。@sarslan。