我如何在Mongoose上检索本周的数据?

时间:2019-12-04 10:54:04

标签: mongodb mongoose aggregation-framework

我有一个针对自己业务(房地产)的所有请求的模型。

我想基于“ createdAt”字段创建一个聚合中间件,该中间件仅返回在周一午夜和当前时间之间创建的模型。

我已经浏览了所有先前的问题,但是找不到任何东西,mongo中的聚合文档非常庞大,我无法动脑筋!

您有什么建议吗?

我已经尝试过了,但是它返回一个空数组:

List

当然,personList.stream() .collect(Collectors.groupingBy(Function.identity(), Collectors.mapping(Person::getId, Collectors.toList()))); .entrySet() .stream() .filter(e -> e.getValue().size() > 1) .forEach(e -> System.out.println(e.getKey().getId() + " " + e.getKey().getName() + " " + e.getKey().getFamilyName() + " " + e.getKey().getBirthday() + " " + e.getValue())); 可能是问题所在。

有什么建议吗?

3 个答案:

答案 0 :(得分:1)

此解决方案使用聚合查询和自定义JavaScript函数。该函数采用日期对象,并返回今天之前的第一个星期一的日期。这用于获取在计算的日期之后的createdAt日期之后的所有文档。

// Function returns the date of the "last Monday" from
// the given input date.
function getLastMonday(dt) {

    let n = null; // last Monday conversion

    switch (dt.getDay()) {
        case 0: n = -5; break;
        case 1: n = -6; break;
        case 2: n = 0; break;
        case 3: n = -1; break;
        case 4: n = -2; break;
        case 5: n = -3; break;
        case 6: n = -4; break;
        default: "This never happens";
    }

    let today_date = new Date(dt.getFullYear(), dt.getMonth(), dt.getDate());
    let last_monday_date = today_date.setDate(today_date.getDate() + n );

    return last_monday_date;
}

var d = ISODate();    // -or- any date like ISODate("2019-11-26T00:00:00Z")
var LAST_MONDAY = getLastMonday(d);

db.test.aggregate( [
{ 
  $addFields: { 
      last_monday: { 
          $dateFromParts : {
              year: { $year: new Date(LAST_MONDAY) }, 
              month: { $month: new Date(LAST_MONDAY) }, 
              day: { $dayOfMonth: new Date(LAST_MONDAY) }
           }
      },
      created_at: { 
          $dateFromParts : {
               year: { $year: "$createdAt" }, 
               month: { $month: "$createdAt" }, 
               day: { $dayOfMonth: "$createdAt" }
           }
       }
  } 
},
{ 
  $match: { $expr: { $gt: [ "$created_at", "$last_monday" ] } }
},
{ 
  $project: { created_at: 0, last_monday: 0 } 
}
] )

对于这样的一组输入文档:

{ _id : 1, createdAt : ISODate("2019-12-03T00:00:00Z") }
{ _id : 2, createdAt : ISODate("2019-11-12T02:00:00Z") }
{ _id : 3, createdAt : ISODate("2019-11-25T05:00:00Z") }
{ _id : 4, createdAt : ISODate("2019-11-26T00:00:00Z") }
{ _id : 9, createdAt : ISODate("2019-12-02T23:45:00Z") }

然后LAST_MONDAY = getLastMonday(ISODate("2019-12-04T05:40:20Z")),聚合查询返回带有_id : 1的文档。

答案 1 :(得分:0)

我正在为此使用momentJS:

const result = Collection.aggregate([
  { 
    $match: {
      createdAt: { 
        $gte: moment().startOf('isoweek').toDate(),
        $lt: moment().endOf('isoweek').toDate()
      },
    }
  }
]);

答案 2 :(得分:0)

我找到了vanillaJS的答案:

const richieste = await Richiesta.aggregate([
            {
                $match: {
                    createdAt: { $gte: getBeginningOfTheWeek(new Date()), $lt: new Date() }
                }
            },
            {
                $group: {
                    _id: null,
                    count: { $sum: 1 }
                }
            },
]}

其中getBeginningOfTheWeek如下:

exports.getBeginningOfTheWeek = (now) => {
    const days = (now.getDay() + 7 - 1) % 7;
    now.setDate(now.getDate() - days);
    now.setHours(0, 0, 0, 0);
    return now;
};

后一个功能来自T.J.人群:get current week moday javascript