在MongoDB中将字符串转换为ISODate

时间:2015-06-16 16:12:46

标签: javascript python mongodb date

我是MongoDB的新手,我坚持使用String to Date转换。在db中,日期项以字符串类型存储为"date":"2015-06-16T17:50:30.081Z"

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

此外,我想将以下mongo查询转换为python代码,这给我带来了同样的问题,我无法在python中调用javascript函数,datetime无法解析mongo语法{ {1}}。

我试过了:

$date

我很好地发现如果字符串是用Javascript或Python给出的,我知道解析它的方法不止一种。但是我不知道如何在MongoDB查询中这样做。

new Date("2015-06-16T17:50:30.081Z")
new Date(Date.parse("2015-06-16T17:50:30.081Z"))
etc...

2 个答案:

答案 0 :(得分:8)

如果您可以确定输入日期字符串的格式并且您只是想获得唯一YYYYMMDD的计数,那么只需$ item上的子串和组:

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 }

答案 1 :(得分:0)

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

// { 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 }

在小组赛阶段,这是

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

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