2017-07-01 28 views
-1

我想从一个日期字段设置时间以当天我如何操纵聚合管道中的日期字段?

function getDate(date){ return new Date(date.getYear(), date.getMonth(), 
date.getDate(), 0,0,0); } 
... 
{"$project" : { 
    "_id" : getDate("$dt"), 
... 
  • 的开始。如果我送"$dt"我得到TypeError: date.getYear is not a function为我传递一个字符串,

  • 如果删除引号,我得到Error: "$dt is not defined",

  • 但如果我将"$dt"设置为"_id"的值,我会得到正确的ISO日期。

那么,如何通过Date对象的功能?

+0

字符串中没有'getYear'方法... – Li357

+0

我认为您正在寻找['$ year'](https://docs.mongodb.com/manual/reference/operator/aggregation/year/ ) 这里。什么是混淆你,我觉得是一样的东西'{“$ GT”,新的日期()}'实际上并没有被发送到服务器,而是“价值”被退回“之前”的请求被发送到服务器,然后使用。您无法将JavaScript函数发送到聚合管道或查询中。除了'$ where'外,实际上它实际上是发送一个“字符串”。 –

+0

@AndrewLi如何传递的日期对象的功能呢?如果我删除引号,我得到“$ DT没有定义”错误,但如果我设置为“$ DT”为“_id”值,我得到一个正确的ISO日期。 – Dane411

回答

0

MongoDB的聚集管道不支持JavaScript。要处理汇总管道中结果的日期值,您需要使用Date Aggregation Operators

例如:

db.date.aggregate([ 
    { $project: { 
     _id: { $dateToString: { format: "%Y%m%d", date: "$dt" }} 
    }} 
]) 

假设你有一个领域的文件名为dtISODate("2017-07-01T10:01:23.344Z")日期值,结果会是什么样子:

{ 
    "result": [ 

    { 
     "_id": "20170701" 
    } 

    ], 
    "ok": 1 
} 

注:如果您有多个文件在同一天,这种方法会在您的结果中创建重复的_id值。您可能要投射到不同的字段名或者是使用$group阶段,而不是$project如果你的目的是要值的同一天相结合。