Javascript 在MongoDB中将字符串转换为ISODate

Javascript 在MongoDB中将字符串转换为ISODate,javascript,python,mongodb,date,Javascript,Python,Mongodb,Date,我是MongoDB的新手,我一直在进行字符串到日期的转换。在数据库中,日期项以字符串形式存储为“日期”:“2015-06-16T17:50:30.081Z” 我想按日期对文档进行分组,并计算每天的总和,因此我必须从日期字符串中提取年、月和日,并删除小时、分钟和秒。我尝试了多种方法,但它们要么返回日期类型1970-01-01,要么返回当前日期 此外,我想将下面的mongo查询转换为python代码,这就产生了同样的问题,我无法在python中调用javascript函数,datetime也无法解析

我是MongoDB的新手,我一直在进行字符串到日期的转换。在数据库中,日期项以字符串形式存储为“日期”:“2015-06-16T17:50:30.081Z”

我想按日期对文档进行分组,并计算每天的总和,因此我必须从日期字符串中提取年、月和日,并删除小时、分钟和秒。我尝试了多种方法,但它们要么返回日期类型1970-01-01,要么返回当前日期

此外,我想将下面的mongo查询转换为python代码,这就产生了同样的问题,我无法在python中调用javascript函数,
datetime
也无法解析mongo语法
$date

我试过:

new Date("2015-06-16T17:50:30.081Z")
new Date(Date.parse("2015-06-16T17:50:30.081Z"))
etc...
我很清楚,如果字符串是用Javascript或Python给出的,我知道不止一种解析方法。但是,我不知道如何在MongoDB查询中实现这一点

  db.collection.aggregate([
                    {
                        //somthing
                    },
                    { 
                        '$group':{
                            '_id':{ 
                                'month':  (new Date(Date.parse('$approTime'))).getMonth(), 
                                'day': (new Date(Date.parse('$approTime'))).getDate(), 
                                'year':  (new Date(Date.parse('$approTime'))).getFullYear(),
                                'countries':'$countries'
                            },
                             'count': {'$sum':1}

                    }
                }
])

如果您可以确定输入日期字符串的格式,并且您只是尝试获取唯一YYYYMMDD的计数,则只需$project子字符串及其组:

var data = [
        { "name": "buzz", "d1": "2015-06-16T17:50:30.081Z"},
        { "name": "matt", "d1": "2018-06-16T17:50:30.081Z"},
        { "name": "bob", "d1": "2018-06-16T17:50:30.081Z"},
        { "name": "corn", "d1": "2019-06-16T17:50:30.081Z"},
      ];

db.foo.drop();
db.foo.insert(data);

db.foo.aggregate([
     { "$project": {
         "xd": { "$substr": [ "$d1", 0, 10 ]}
         }
 },
 { "$group": {
             "_id": "$xd",
             "n": {$sum: 1}
         }
     }
              ]);

{ "_id" : "2019-06-16", "n" : 1 }
{ "_id" : "2018-06-16", "n" : 2 }
{ "_id" : "2015-06-16", "n" : 1 }

Mongo 4.0
开始,您可以使用将字符串转换为日期:

// { name: "buzz", d1: "2015-06-16T17:50:30.081Z" }
// { name: "matt", d1: "2018-06-16T17:50:30.081Z" }
// { name: "bob",  d1: "2018-06-16T17:50:30.081Z" }
// { name: "corn", d1: "2019-06-16T17:50:30.081Z" }
db.collection.aggregate(
  { $group: {
    _id: { $dateToString: { date: { $toDate: "$d1" }, format: "%Y-%m-%d" } },
    n: { $sum: 1 }
  }}
)
// { _id: "2015-06-16", n: 1 }
// { _id: "2018-06-16", n: 2 }
// { _id: "2019-06-16", n: 1 }
在小组阶段,这:

  • 首先使用运算符将字符串(如
    “2015-06-16T17:50:30.081Z”
    )转换为日期对象(
    ISODate(“2015-06-16T17:50:30.081Z”)

  • 然后使用运算符将转换后的日期(如
    ISODate(“2015-06-16T17:50:30.081Z”)
    )转换回字符串(
    “2015-06-16”
    ),但这次使用此格式
    %Y-%m-%d”


为什么要将日期存储为字符串?@Buzz其他人这样做了,此时我必须在不更改生产环境的情况下获取数据moment@BuzzMoschetti我将其存储为字符串的原因是我不想转换为UTC时间。我需要对周数进行分组,所以当我在UTC进行分组时,(我是AEST(悉尼)时间),在8月31日下午的某个地方,会出现在9月1日上午6:00的一些情况。这可能只是意味着它被算作前一周的数字。我现在一直使用Mongo 2.6,因此除了在导入中提取AEST Weeknumber并将其单独存储外,没有太多选项。对于答案,我应该记得早些时候使用了
$project
。聚合之后,我只需使用
forEach
并通过日期字符串的子字符串构建一个
ISODate