Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 在任意深度搜索时,如何仅投影在Mongo中发现的内容?_Mongodb_Mongodb Query - Fatal编程技术网

Mongodb 在任意深度搜索时,如何仅投影在Mongo中发现的内容?

Mongodb 在任意深度搜索时,如何仅投影在Mongo中发现的内容?,mongodb,mongodb-query,Mongodb,Mongodb Query,我有一个类似的问题,那就是在任意深度搜索 但是,我只想检索实际找到的内容及其上面的层次结构,而不是整个文档,它看起来像find的默认行为 如果未指定任何投影,db.collection.find方法将返回与查询匹配的所有文档的所有字段 例如,我有一个像这样的对象*: { "_id": 1, "template": { "a": { "node1": { "options": {

我有一个类似的问题,那就是在任意深度搜索

但是,我只想检索实际找到的内容及其上面的层次结构,而不是整个文档,它看起来像find的默认行为

如果未指定任何投影,db.collection.find方法将返回与查询匹配的所有文档的所有字段

例如,我有一个像这样的对象*:

{
    "_id": 1,
    "template": {
        "a": {
            "node1": {
                "options": {
                    "configuration": "true"
                }
            },
            "node2": {
                "options": {
                    "configuration": "false"
                },
                "a":{
                    "node1": {
                        "options": {
                            "configuration": "false"
                        }
                    }
                },
                "b":{}
            },
            "node3": {
                "options": {
                    "configuration": "false"
                },
                "a":{
                    "node1": {
                        "options": {
                            "configuration": "true"
                        }
                    }
                },
                "b":{}
            }
        },
        "b": {
            "node1": {
                "options": {
                    "configuration": "true"
                },
                "a":{
                    "node1": {
                        "options": {
                            "configuration": "true"
                        }
                    }
                },
                "b":{
                    "node1": {
                        "options": {
                            "configuration": "false"
                        }
                    }
                }
            }            
        }
    }
}
我正在尝试查找configuration=false的任何匹配项,并希望仅检索匹配项及其上方的所有内容,如:

{
    "_id": 1,
    "template": {
        "a": {
            "node2": {
                "options": {
                    "configuration": "false"
                },
                "a": {
                    "node1": {
                        "options": {
                            "configuration": "false"
                        }
                    }
                }
            },
            "node3": {
                "options": {
                    "configuration": "false"
                }
            }
        },
        "b": {
            "node1": {
                "options": {
                    "configuration": "true"   <-- still get this as it has a matching child
                },
                "b": {
                    "node1": {
                        "options": {
                            "configuration": "false" <-- Matches here
                        }
                    }
                }
            }
        }
    }
}
我看过$project,但我不知道如何在这种情况下使用它

OBS:

*在你谈论数据的结构之前,我知道没有任何上下文,is看起来不是一个好的设计,但与我提到的问题类似,这个数据也是从某种XML导入中获得的,而且它已经满足了我们的需要,没有办法改变它。

您可以使用中的as:

但这只是一个层面

在服务器端执行此操作与在客户端执行此操作相比没有太大的优势。操作中最困难的部分是搜索本身,因此搜索应该尽可能优化。对于投影,MongoDB只实现了一些基本需求,而将更复杂的内容留给了客户

为了优化,我们在每个深度使用单独的索引进行了单独的查询:

db.brand.ensureIndex({products.navigations.subNavigations._id : 1}, {unique : true, sparse: true, name : "unique.subnavigation1.id"})
db.brand.ensureIndex({products.navigations.subNavigations.subNavigations._id : 1}, {unique : true, sparse: true, name : "unique.subnavigation2.id"})
db.brand.ensureIndex({products.navigations.subNavigations.subNavigations.subNavigations._id : 1}, {unique : true, sparse: true, name : "unique.subnavigation3.id"})
您可以在中使用as:

但这只是一个层面

在服务器端执行此操作与在客户端执行此操作相比没有太大的优势。操作中最困难的部分是搜索本身,因此搜索应该尽可能优化。对于投影,MongoDB只实现了一些基本需求,而将更复杂的内容留给了客户

为了优化,我们在每个深度使用单独的索引进行了单独的查询:

db.brand.ensureIndex({products.navigations.subNavigations._id : 1}, {unique : true, sparse: true, name : "unique.subnavigation1.id"})
db.brand.ensureIndex({products.navigations.subNavigations.subNavigations._id : 1}, {unique : true, sparse: true, name : "unique.subnavigation2.id"})
db.brand.ensureIndex({products.navigations.subNavigations.subNavigations.subNavigations._id : 1}, {unique : true, sparse: true, name : "unique.subnavigation3.id"})


没有任何数组,为什么需要位置运算符?嗯,是的,你说得对。如果它是带有“type”属性的嵌套数组,而不是作为键的随机名称,那么它将或多或少是一个有效的解决方案……我刚才在想你说的在客户端执行此操作的内容。我已经试过了,但我认为让服务器来提供它会更容易、更高效。现在我回到第一个方法如果性能是一个问题,您肯定应该更改您的DB模式。或者在它旁边创建一个新的非规范化集合。在客户端执行此操作时,我并没有尝试真正测试性能。我只是觉得在客户机上做太多了,但我现在正在重新考虑。没有任何数组,为什么需要位置运算符?嗯,是的,你说得对。如果它是带有“type”属性的嵌套数组,而不是作为键的随机名称,那么它将或多或少是一个有效的解决方案……我刚才在想你说的在客户端执行此操作的内容。我已经试过了,但我认为让服务器来提供它会更容易、更高效。现在我回到第一个方法如果性能是一个问题,您肯定应该更改您的DB模式。或者在它旁边创建一个新的非规范化集合。在客户端执行此操作时,我并没有尝试真正测试性能。我只是觉得在客户端执行太多了,但我现在正在重新思考。如何查询此问题?@greyfairer它可以工作,但它会返回我的所有文档,因为每个文档都至少有一个条件匹配的情况。在.find查询中,无法以编程方式使用$project。你可以使用聚合管道,但我不确定我是否看到任何可能的用法对你真正有好处。是的,我明白了。我想这可能很简单:PHow do you query this?@greyfairer它可以工作,但它会返回我的所有文档,因为每个文档都至少有一个case条件匹配。在.find查询中,无法通过编程方式使用$project。你可以使用聚合管道,但我不确定我是否看到任何可能的用法对你真正有好处。是的,我明白了。我想这很容易:P