1

我有一个复杂的文档结构,如下所示 -

{
    "Application": {
        "DEF": {
            "Year": {
                "2018": {
                    "Quarter": {
                        "Q1": {
                            "Microservice": [ "A", "B" ]
                        },
                        "Q2": {
                            "Microservice": [ "C", "D" ]
                        },
                        "Q3": {
                            "Microservice": [ "E" ]
                        },
                        "Q4": {
                            "Microservice": [ "F", "G" ]
                        }
                    }
                },
                "2019": {
                    "Quarter": {
                        "Q1": {
                            "Microservice": [ "A", "C" ]
                        },
                        "Q2": {
                            "Microservice": [ "D" ]
                        },
                        "Q3": {
                            "Microservice": [ "E", "F" ]
                        },
                        "Q4": {
                            "Microservice": [ "G" ]
                        }
                    }
                }
            }
        }
    },
    "Product Name": "XYZ"
}

我正在尝试查询 Application 为 DEF、Year 为 2018 和所有 Quarters 的所有记录。我已经尝试过如下的 DOT(.) 表示法——

db.productsTest.find({"Application.DEF.Year.2018": {$exists: true}})

以上返回所有年份(2018 年和 2019 年)的结果,而不是仅返回 2018 年的年份、季度和微服务组合。这也可能是因为 JSON 结构,我无法按年份过滤(因为它们是嵌套的) . 基本上我正在寻找返回这个的查询——

{
    "Application": {
        "DEF": {
            "Year": {
                "2018": {
                    "Quarter": {
                        "Q1": {
                            "Microservice": [ "A", "B" ]
                        },
                        "Q2": {
                            "Microservice": [ "C", "D" ]
                        },
                        "Q3": {
                            "Microservice": [ "E" ]
                        },
                        "Q4": {
                            "Microservice": [ "F", "G" ]
                        }
                    }
                }
            }
        }
    },
    "Product Name": "XYZ"
}

考虑到我的 JSON 结构,这个结果是否可能?

4

2 回答 2

3

以下查询完成了工作:

db.productsTest.find({
    "Application.DEF.Year.2018": { $exists: true } // exclude documents from the result that do not contain the subdocument that we are interested in
}, {
    "_id": 0, // we do not want the _id field in the result document
    "Product Name" : 1, // but the "Product Name" should be included
    "Application.DEF.Year.2018": 1 // and so should be the subdocument we are interested in
})

基本上,这只是一个带有projection的标准查询

$exists是一个元素运算符,用于检查属性是否存在。

于 2017-11-29T20:56:07.987 回答
2

您可以使用$exists运算符查找包含指定字段的文档!使用您提供的测试数据,这对我有用:

db.productsTest.findOne({"Application.DEF.Year.2018.Quarter.Q1":{$exists:true}})

并返回您提供的测试文件。

附带说明:除非您有充分的理由使用这种嵌套结构,否则扁平化文档可以提高可读性。

于 2017-11-29T20:58:11.013 回答