【问题标题】:mongodb aggregate with $match and unwindmongodb 聚合 $match 和 unwind
【发布时间】:2016-09-30 20:59:59
【问题描述】:

基于this问题...

我正在尝试创建一个聚合函数并根据子数组中的值过滤我的数组。目前我的数组结构如下:

'id':1,
'data': {
   'value':1    
 }
'id':2,
'data': {
   'value':1    
 }
'id':3,
'data': {
   'value':2    
 }

所以我需要获取 data.value 为 1 的所有项目。目前为了做到这一点,我必须执行以下操作:

db.ids.aggregate([
{$match:{id:{$exists:true}}}, //some more matching conditions here...
{$unwind:'$data'},
{$match:{'data.value':1}}//need to get rid of this and move it to the first $match

所以问题是我可以摆脱第二个 $match 并将我的子数组过滤条件放入第一个匹配项中吗?我试图这样做,但它不起作用并返回了整个文档。我真的需要根据子数组值过滤我的数组,因为我的数据库会变得非常大,我不希望在整堆文档上使用 $unwind。 谢谢。

【问题讨论】:

  • 您能否添加一个完整文档的示例,因为目前尚不清楚(至少对我而言)您的文档是什么样子 - 我目前不确定您显示的数据是否应该代表 3 个文档或一个包含这 3 个子文档的嵌套数组的文档。

标签: arrays mongodb


【解决方案1】:

您可以在第一个匹配项本身中添加多个条件。

db.ids.aggregate([
  {$match:{id:{$exists:true}, "data.value": 1}}
])

然后放松一下。

【讨论】:

  • 不幸的是,这也没有帮助。我也尝试用 $and 添加多个条件,但也没有用。
  • 您需要将 data.value 替换为架构中的任何内容。我正在查看您的链接问题,其中数据数组位于 services.TCP80.data。在这里,您提到了数据数组中的项目,但它看起来不像数组。如果您可以提供示例文档,可能会有所帮助。
【解决方案2】:

试试下面:

 db.ids.aggregate([
{$match:{id:{$exists:true}}, 'data.value':1},
{$unwind:'$data'}

【讨论】:

  • 我已经尝试过了,但没有帮助。它仍然返回所有没有过滤器的数据。它仅在 $unwind 之后使用 $match 时过滤
  • @Jack 你的意思是它返回的数据值为 2 即 data.value: 2 记录?
  • 是的,它也返回 data.value:2 虽然我明确表明我只需要 'data.value':1。就是这样
  • 我不知道为什么它的行为不同,因为在我这边它只是获取 data.value: 1 only。
猜你喜欢
  • 2020-08-06
  • 1970-01-01
  • 2021-05-04
  • 1970-01-01
  • 1970-01-01
  • 2013-03-10
  • 2015-12-03
  • 1970-01-01
  • 2020-09-22
相关资源
最近更新 更多