为了账号安全,请及时绑定邮箱和手机立即绑定

在Mongo DB中以ISO字符串格式获取不到一周的数据

在Mongo DB中以ISO字符串格式获取不到一周的数据

牧羊人nacy 2022-09-29 16:48:14
我正在尝试获取 mongo db 中一周前的数据这是我需要检查的字段 -{ _id:821398723913, closed_at:"2020-06-10T01:43:59-04:00"}我想要的是返回closed_at不到一周的所有对象。我在网上看过,但没有一个解决方案有效。编辑:到目前为止,我已经尝试过 -db.Orders.aggregate([{            $project: {                date: {                    $dateFromString: {                        dateString: '$date'                    }                }            }        }, {            $match: {                "closed_at": {                    $lt: lastDayWeek,                    $gt: firstDayWeek                }            }        }]);和Orders.find({'closed_at':  {                $gte: new Date((new Date().getTime() - (15 * 24 * 60 * 60 * 1000)))            }, 'cancelled_at': null}).sort({_id: 1});我需要周一到周一,我正试图用$isoWeek解决这个问题,但到目前为止还没有运气
查看完整描述

2 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

你可以试试这个:


db.Orders.aggregate([

  {

    "$addFields": {

      "closed_at_iso": {

        "$toDate": "$closed_at"

      }

    }

  },

  {

    $match: {

      "closed_at_iso": {

        $gte: new Date(new Date() - 7 * 24 * 60 * 60 * 1000)

      }

    }

  }

])

这里的问题是日期字段实际上是一个字符串,我们需要先将其转换为格式,然后运算符工作正常。ISODate$match


编辑:


要获取上周周一和本周一之间的数据,您可以尝试:


var start = new Date(2020, 5, 1), // last monday

    end = new Date(2020, 5, 8);   // this monday


db.collection.aggregate([

  {

    "$addFields": {

      "closed_at_iso": {

        "$toDate": "$closed_at"

      }

    }

  },

  {

    $match: {

      "closed_at_iso": {

        $gte: start,

        $lte: end

      }

    }

  }

])

如果你想让它变得动态,我们可以很容易地得到上周一和这个星期一,比如:


function getMonday(d) {

  d = new Date(d);

  var day = d.getDay(), diff = d.getDate() - day + (day == 0 ? -6:1);

  return new Date(d.setDate(diff));

}       


var start = getMonday(new Date().setDate(new Date().getDate() - 7))

var end = getMonday(new Date())


console.log(start)

console.log(end)


查看完整回答
反对 回复 2022-09-29
?
慕虎7371278

TA贡献1802条经验 获得超4个赞

使用palash的答案想出一个解决方案


let beforeOneWeek = new Date(new Date().getTime() - 60 * 60 * 24 * 7 * 1000)

            , day = beforeOneWeek.getDay()

            , diffToMonday = beforeOneWeek.getDate() - day + (day === 0 ? -6 : 1)

            , lastMonday = new Date(beforeOneWeek.setDate(diffToMonday))

            , lastSunday = new Date(beforeOneWeek.setDate(diffToMonday + 6));



        const orders = await Orders.aggregate([

            {

                '$addFields': {

                    'created_at_iso': {

                        '$toDate': '$created_at'

                    }

                }

            },

            {

                $match: {

                    'created_at_iso': {

                        $gte: lastMonday,

                        $lte: lastSunday

                    }

                }

            }

        ]);


查看完整回答
反对 回复 2022-09-29
  • 2 回答
  • 0 关注
  • 124 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号