【问题标题】:Mongo aggregate $group issueMongo 聚合 $group 问题
【发布时间】:2015-11-18 06:14:53
【问题描述】:

我有这个模型数据:

var orders = [{
  _id: 'order_1'
  users: [{
    name: 'Bob'
    _id: 'user_1',
    company: 'company_1'
  }, {
    name: 'John'
    _id: 'user_3',
    company: 'company_2'
  }]
}, {
  _id: 'order_2'
  users: [{
    name: 'Mary'
    _id: 'user_2',
    company: 'company_1'
  }]}];

使用我想最终得到的聚合框架:

 [{
  _id: 'user_1',
  order: 'order_1',
  company: 'company_1'
}, {
  _id: 'user_2',
  order: 'order_2',
  company: 'company_1'
}];

代码:

return Order.aggregateAsync([{
  $unwind: '$users'
}, {
  $match: {
    'users.company': 'company_1'
  }
}, {
  $project: {
    id: '$users._id',
    order: '$_id',
    company: '$users.company',
  }
}, {
  $group: {
    _id: "$users"
  }
}]);

但有些地方不太对劲。一旦我添加了 $group 参数,我就会丢失结果中的所有数据,最后只剩下数组中的用户 ID。

[ 
  { _id: 'user_1' },
  { _id: 'user_2' } 
]

如何将我预测的所有数据返回到结果中?

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:

    一旦对行进行分组,聚合就不确定您需要哪一行,除非您指定它。 使用$group,您甚至不需要$project。此查询可能会为您提供所需的内容:

    return Order.aggregateAsync([{
      $unwind: '$users'
    }, {
      $match: {
        'users.company': 'company_1'
      }
    }, {
      $group: {
        _id: "$users",
        id: { $first: '$users._id' },
        order: { $first: '$_id' },
        company: { $first: '$users.company' },
      }
    }]);
    

    我基本上只是将您的投影移到了分组下,您可以在其中使用$first$last 或其他表达式。

    【讨论】:

      猜你喜欢
      • 2018-07-15
      • 2018-08-18
      • 1970-01-01
      • 1970-01-01
      • 2017-10-12
      • 2020-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多