我想在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是一个数组数组,我无法直接将该关键字与此字段进行比较。我尝试了不同的方法来解决这个问题,但到目前为止还没有运气。
非常感谢任何帮助。
谢谢!
答案 0 :(得分:1)
由于您只需要与您的搜索匹配的(双)嵌套元素,您可以先$unwind
这两个数组,然后只需使用$match
来获取所需的元素:
[
{
$unwind:
"$pages"
},
{
$unwind:
"$pages.texts"
},
{
$match:{
"pages.texts.text":"bar1"
}
},
{
$project: {
_id:true,
text: "$pages.texts.text"
}
}
]