mongodb - 在 Mongodb 中过滤数组内部的数组

标签 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"
    ]
]
}

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

如有任何帮助,我们将不胜感激。

谢谢!

最佳答案

因为您只需要与您的搜索相匹配的(双)嵌套元素,您可以先$unwind 两个数组,然后使用$match 获取元素你想要:

[
    {
        $unwind: 
            "$pages"

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

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

关于mongodb - 在 Mongodb 中过滤数组内部的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39217005/

相关文章:

mongodb - Mongoose 中的 db.collection.stats() 命令是什么?

MongoDB:匹配数组中的非空文档

mongodb - 为什么如果我使用 Mongoose 在匹配条件中传递 _id ,批量更新操作不起作用?

mongodb - 如何使用 MongoDB 从聚合结果中投影附加数据?

javascript - 自定义 MongoDB 查询以返回特定的子文档

mongodb - 如何在 MongoDB 中汇总总和以获得总计数?

MongoDB 使用聚合连接两个字段,其中实际字段在数组中

ruby-on-rails - 如何在 Mongoid 中查询多个 id?

mongodb - 如何在Mongodb java驱动程序中编写多个group by id字段

mongodb - 仅显示 mongodb 数组中找到的元素