Mongodb 在Mongo DB中过滤阵列中的阵列
我想过滤Mongo DB中数组中的数组。例如,给定以下两个文档:Mongodb 在Mongo DB中过滤阵列中的阵列,mongodb,mongodb-query,aggregation-framework,Mongodb,Mongodb Query,Aggregation Framework,我想过滤Mongo DB中数组中的数组。例如,给定以下两个文档: { "_id" : 1.0, "pages" : [ { "texts" : [ { "text" : "foo" }, { "text" : "foo1" }, { "text" :
{
"_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": "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"
]
]
}
似乎文本是数组的数组,我无法直接将关键字与此字段进行比较。我尝试过不同的方法来解决这个问题,但到目前为止运气不佳
任何帮助都将不胜感激
谢谢大家! 由于您只需要与搜索匹配的(双)嵌套元素,因此可以先$unwind
两个数组,然后只需使用$match
即可到达所需的元素:
[
{
$unwind:
"$pages"
},
{
$unwind:
"$pages.texts"
},
{
$match:{
"pages.texts.text":"bar1"
}
},
{
$project: {
_id:true,
text: "$pages.texts.text"
}
}
]
我会添加
{$project:{{u id:1,pages:1}
作为第一个阶段来优化它。不幸的是,我不能这样做,因为$pages.text.text有一个文本索引(一个带有另一个字段的复合文本升序索引),mongo db不允许我以这种方式匹配。我没有提到过让事情简单化,但它似乎会影响。