在Mongo DB

时间:2016-08-30 00:11:48

标签: mongodb mongodb-query aggregation-framework

我想在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" : [

]
}

它显示正确的_id但没有文字。

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

{ 
"_id" : 2.0, 
"text" : [
    [
        "bar", 
        "bar1", 
        "bar2"
    ]
]
}

似乎text是一个数组数组,我无法直接将该关键字与此字段进行比较。我尝试了不同的方法来解决这个问题,但到目前为止还没有运气。

非常感谢任何帮助。

谢谢!

1 个答案:

答案 0 :(得分:1)

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

[
    {
        $unwind: 
            "$pages"

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

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