【问题标题】:Mongo aggregation queryMongo聚合查询
【发布时间】:2016-04-13 15:54:45
【问题描述】:

我有一个有趣的问题。例如,我有一个带有 start_dateend_date 的 mongo 集合。我需要创建一个聚合查询(或 mapReduce),它将返回一个具有重叠日期的数组数组。

例如:

收藏:

[{
  _id: 1111111,
  start_date: '10/04/2016',
  end_data: '13/04/2016'
},
{
  _id: 2222222,
  start_date: '11/04/2016',
  end_data: '20/04/2016'
},
{
  _id: 3333333,
  start_date: '10/05/2016',
  end_data: '13/05/2016'
},
{
  _id: 44444444,
  start_date: '12/05/2016',
  end_data: '15/05/2016'
},
{
  _id: 55555555,
  start_date: '18/04/2016',
  end_data: '22/04/2016'
}]

应该返回

[[1111111, 2222222], [3333333,44444444], [2222222, 55555555]]

【问题讨论】:

  • 如果您有超过 2 个文件重叠怎么办?
  • 不,你不能通过聚合来做到这一点,你需要在应用程序中做到这一点。
  • 不可能?不...怎么样:项目(将2个日期放在一个数组中)>在该数组上展开>按日期分组>如果一个日期是开始而另一个是结束则匹配> addToSet thesw分组ID......它是全局的想法,我会尝试给出确切的代码。
  • VonD 是的,它可以不只是 2 个文档重叠。 BanksySan,我知道这是可能的。 Ludovic 如果您能提供任何示例,那就太好了,我喜欢您的想法!也许存储过程也可以?

标签: mongodb mapreduce mongodb-query aggregation-framework


【解决方案1】:

我认为这样的事情会做,必须尝试使用​​真实数据来验证。

我将其作为一个总体想法发布,如果您有更清楚的内容,请任何人验证并修复答案。

db.collection.aggregate([
{$project: {
        _id:$_id,
        dates: [{no:1, date:$start_date},{no:2,date:$end_date}]
}},
{$unwind: $dates},
{$group: _id: $dates.date ,
        start_dates: {$addToSet: {$cond:{if:{$eq:[1, $dates.no]}, 
            then: [$_id], 
            else: null}}},
        end_dates: {$addToSet: {$cond:{if:{$eq:[2, $dates.no]}, 
            then: $_id, 
            else: null}}}
},
{$match: {$start_dates.1:{$exists:true}, 
        $end_dates.1{$exists:true}}}
]), //At this point you have objects like { aDate, [lst of ids with that date as start], [lst of ids with that date as end]}
{$unwind: $start_dates},
{$group: {_id: {date:$_id, id:$start_dates.1}, // You still have 1 array of array per dates, you can always put "_id: 1" to have only 1 array as answer
        res: {$addToSet:{$start_dates: {$each: $end_dates}}}}
}

【讨论】:

    猜你喜欢
    • 2015-03-20
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 2017-05-02
    • 2021-06-19
    • 1970-01-01
    相关资源
    最近更新 更多