我想在 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/