如何在MongoDB中的多层嵌入式文档中进行查询?

如何在MongoDB中的多层嵌入式文档中进行查询?,mongodb,mongodb-query,Mongodb,Mongodb Query,假设我有一个MongoDB(4.2.9)集合,其结构如下: { _id: 'Alice', pets: { 'Marmaduke': { 'age': 9 }, 'Clifford': { 'age': 3 } } }, { _id: 'Bob', pets: { 'Odie': { 'age': 6

假设我有一个MongoDB(4.2.9)集合,其结构如下:

{
    _id: 'Alice',
    pets: {
        'Marmaduke': {
            'age': 9
        },
        'Clifford': {
            'age': 3
        }
    }
},
{
    _id: 'Bob',
    pets: {
        'Odie': {
            'age': 6
        }
    }
}
我如何查询所有宠物年龄超过5岁的主人?理想情况下,投影只包括搜索字段下的匹配嵌入文档,因此结果集看起来就像没有Clifford的示例

在我看来,文档应该很容易回答这个问题,但我能找到的只是匹配嵌入文档数组的操作,而不是嵌入文档的文档。我觉得对文档数组进行建模要常见得多,但我很难理解这一点,因为(在我的用例中)宠物是由其所有者和名称唯一标识的,Marmaduke上的更新操作应该如下所示:

{
    _id: 'Alice'
},
{
    $set: {
        pets.Marmaduke.age: 10
    }
}

而不必在数组中查找
{u id:'Marmaduke'}
。但是,如果我应该以不同的方式思考嵌入式文档,请解释。

请告诉我这是否是您所需要的。看起来这样就可以了,谢谢。所以最简单的解决方案就是将对象转换成数组,搜索它,然后再转换回来?你知道在查询计划中是否存在明显的性能损失,或者是
$objectToArray
$arrayToObject
被优化了吗?我认为你最好将
pets
设置为
数组,而不是直接的
对象
-例如,你可以将其设置为
“pets”[{“name”:“Clifford”,“age”:3}]
-因为除了使用
$objectToArray
使查询更昂贵外,还可能需要使用稀疏索引。