【问题标题】:Filtering an array inside an array in Mongo DB在Mongodb中过滤数组内的数组
【发布时间】:2017-01-06 02:52:13
【问题描述】:

我想在 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,但没有文本。

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

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

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

任何帮助将不胜感激。

谢谢!

【问题讨论】:

    标签: mongodb mongodb-query aggregation-framework


    【解决方案1】:

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

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

    【讨论】:

    • 我会在第一阶段添加{$project:{_id:1, pages:1} 来稍微优化一下。
    • 不幸的是我不能这样做,因为 $pages.texts.text 有一个文本索引(与另一个字段的组合文本升序索引),而 mongo db 不允许我以这种方式匹配。我没有提到这也让事情变得简单,但它似乎影响了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2020-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-17
    • 1970-01-01
    相关资源
    最近更新 更多