Mongodb 在Mongo DB中过滤阵列中的阵列

Mongodb 在Mongo DB中过滤阵列中的阵列,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我想过滤Mongo DB中数组中的数组。例如,给定以下两个文档: { "_id" : 1.0, "pages" : [ { "texts" : [ { "text" : "foo" }, { "text" : "foo1" }, { "text" :

我想过滤Mongo DB中数组中的数组。例如,给定以下两个文档:

{ 
"_id" : 1.0, 
"pages" : [
    {
        "texts" : [
            {
                "text" : "foo"
            }, 
            {
                "text" : "foo1"
            }, 
            {
                "text" : "foo2"
            }
        ]
    }
]
}
{ 
"_id" : 2.0, 
"pages" : [
    {
        "texts" : [
            {
                "text" : "bar"
            }, 
            {
                "text" : "bar1"
            }, 
            {
                "text" : "bar2"
            }
        ]
    }
]
}
我需要一个查询来查找_id和给定文本作为输入的文本,例如,对于关键字“bar1”,输出如下:

{ 
"_id" : 2.0, 
"text": "bar1"
}
db.collection.aggregate([{$match:{"pages.texts.text":"bar1"}},
                { $project:
                    { text: 
                        { $filter: 
                            { input: '$pages.texts.text', 
                              as: 'text', 
                              cond: { $eq: [ "$$text" , "bar1"]}
                            }
                        },
                      _id:1
                    }
                }
                ])
如果我要查找的文本位于文档顶层的单个数组中,我可以实现这一点,但我不能使用另一个数组中的数组

到目前为止,我的查询如下所示:

{ 
"_id" : 2.0, 
"text": "bar1"
}
db.collection.aggregate([{$match:{"pages.texts.text":"bar1"}},
                { $project:
                    { text: 
                        { $filter: 
                            { input: '$pages.texts.text', 
                              as: 'text', 
                              cond: { $eq: [ "$$text" , "bar1"]}
                            }
                        },
                      _id:1
                    }
                }
                ])
其输出如下:

{ 
"_id" : 2.0, 
"text" : [

]
}
它显示正确的_id,但没有文本

如果在过滤器中将运算符$eq更改为$ne,则输出为:

{ 
"_id" : 2.0, 
"text" : [
    [
        "bar", 
        "bar1", 
        "bar2"
    ]
]
}
似乎文本是数组的数组,我无法直接将关键字与此字段进行比较。我尝试过不同的方法来解决这个问题,但到目前为止运气不佳

任何帮助都将不胜感激

谢谢大家!

由于您只需要与搜索匹配的(双)嵌套元素,因此可以先
$unwind
两个数组,然后只需使用
$match
即可到达所需的元素:

[
    {
        $unwind: 
            "$pages"

    },
    {
        $unwind: 
            "$pages.texts"

    },
    {
        $match:{
            "pages.texts.text":"bar1"
        }
    },
    {
        $project: {
            _id:true,
            text: "$pages.texts.text"
        }
    }
]               

我会添加
{$project:{{u id:1,pages:1}
作为第一个阶段来优化它。不幸的是,我不能这样做,因为$pages.text.text有一个文本索引(一个带有另一个字段的复合文本升序索引),mongo db不允许我以这种方式匹配。我没有提到过让事情简单化,但它似乎会影响。