找到mongoDB集合中存在的键(可以嵌套n层)的更好和最佳方法是什么?

xoshrz7s  于 2023-08-04  发布在  Go
关注(0)|答案(1)|浏览(100)

让我们把我的文件在集合看起来像这样的波纹管

{
    "data": [
        {
            "MainId": 1111,
            "firstName": "Sherlock",
            "lastName": "Homes",
            "categories": [
                {
                    "CategoryID": 1,
                    "CategoryName": "Example"
                }
            ]
        },
        {
            "MainId": 122,
            "firstName": "James",
            "lastName": "Watson",
            "categories": [
                {
                    "CategoryID": 2,
                    "CategoryName": "Example2"
                }
            ]
        }
    ],
    "messages": [], // blank json
    "success": true // boolean value
}

字符串
所以我需要搜索关键字是否存在CategoryID在文档中或没有,这只是一个例子,我的搜索关键字可以是任何东西,可以嵌套到任何级别
找到密钥是否存在的更好和最优的方法是什么?Note: each document structure might vary so need to find whether the key is present in the whole collection or not
我可以遍历集合中的所有文档,并递归地深入到内部来检查密钥的存在,但这是蛮力解决方案,我如何优化它?
我需要的是:

  • MongoDb聚合查询(如果存在)
  • 或者用其他更好的最佳方式来做
wnavrhmk

wnavrhmk1#

您可以添加presentKeys数组字段,并将您在文档中设置的所有键都推到它。
下面是给定示例的外观:

{
    "presentKeys": [
        "data",
        "data.MainId",
        "data.firstName",
        "data.lastName",
        "data.categories",
        "data.categories.CategoryID",
        "data.categories.CategoryName",
        "messages",
        "success",
    ],
    "data": [
        {
            "MainId": 1111,
            "firstName": "Sherlock",
            "lastName": "Homes",
            "categories": [
                {
                    "CategoryID": 1,
                    "CategoryName": "Example"
                }
            ]
        },
        {
            "MainId": 122,
            "firstName": "James",
            "lastName": "Watson",
            "categories": [
                {
                    "CategoryID": 2,
                    "CategoryName": "Example2"
                }
            ]
        }
    ],
    "messages": [], // blank json
    "success": true // boolean value
}

字符串
然后索引该字段以避免完整集合扫描:

db.collection.createIndex({ presentKeys: 1 });


现在,您可以通过以下方式查询包含某个键的文档:

db.collection.find({ presentKeys: "data.categories.CategoryID" });

相关问题