猿问

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

我正在尝试获取 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解决这个问题,但到目前为止还没有运气


牧羊人nacy
浏览 126回答 2
2回答

米琪卡哇伊

你可以试试这个: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 mondaydb.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)

慕虎7371278

使用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                    }                }            }        ]);
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答