1

在我的查询中, concat 关键字不起作用,它返回null.

这是查询:-

db.leads.aggregate([
{$project:{
    _id:0,
    status:1,
    stage:1,
    "todo.title":1,
    created:{
        day:{$substr:["$createdOn",8,2]},
        month:{$substr:["$createdOn",5,2]},
        year:{$substr:["$createdOn",0,4]}
        },
     myDate:{$concat:["$created.day","-","$created.month","-","$created.day"]}
         //----above $concat is not working-----//
         //--i want that `myDate` should be "12-09-2016"----//
    }
  }

])

这是查询输出:-

{
    "stage" : "Prospect",
    "todo" : [],
    "status" : "OPEN",
    "created" : {
        "day" : "12",
        "month" : "09",
        "year" : "2016"
    },
    "myDate" : null

   //--here i want that `myDate` should be "12-09-2016"----//
}

createdOn字段数据存储在 mongodb 作为日期类型,即

在此处输入图像描述

4

1 回答 1

5

您不一定需要$concat操作员(即,如果您使用的是 MongoDB 3.0 和更新版本),$dateToString操作员已经为您执行此操作:

db.leads.aggregate([
    {
        "$project": {           
            "status": 1,
            "stage": 1,
            "todo.title": 1,
            "created": {
                "day": { "$dayOfMonth": "$createdOn" },
                "month": { "$month": "$createdOn" },
                "year": { "$year": "$createdOn" }
            },
            "myDate": { "$dateToString": { "format": "%Y-%m-%d", "date": "$createdOn" } }   
        }
    }
])

如果您使用的是不支持$dateToString操作符的 MongoDB 2.6 或更早版本,那么您需要两个$project管道阶段。第一个创建创建的日期字段,然后将结果传递到$project创建的下一个阶段myDate

以下示例显示了这种方法:

db.leads.aggregate([
    {
        "$project": {           
            "status": 1,
            "stage": 1,
            "todo.title": 1,
            "created": {
                "day": { "$substr": ["$createdOn", 8, 2] },
                "month": { "$substr": ["$createdOn", 5, 2] },
                "year": { "$substr": ["$createdOn", 0, 4] }
            }   
        }
    },
    {
        "$project": {
            "_id": 0,
            "status": 1,
            "stage": 1,
            "todo": 1,
            "created": 1,
            "myDate": { 
                "$concat": [
                    "$created.year", 
                    "-", 
                    "$created.month", 
                    "-", 
                    "$created.day"
                ] 
            }       
        }
    }
])

或者更确切地说,作为带有表达式作为$concat参数的单个管道:

db.leads.aggregate([
    {
        "$project": {
            "_id": 0,           
            "status": 1,
            "stage": 1,
            "todo.title": 1,
            "created": {
                "day": { "$substr": ["$createdOn", 8, 2] },
                "month": { "$substr": ["$createdOn", 5, 2] },
                "year": { "$substr": ["$createdOn", 0, 4] }
            },
            "myDate": { 
                "$concat": [
                    { "$substr": ["$createdOn", 0, 4] }, 
                    "-", 
                    { "$substr": ["$createdOn", 5, 2] }, 
                    "-", 
                    { "$substr": ["$createdOn", 8, 2] }
                ] 
            }       
        }
    }
])
于 2016-09-27T07:57:33.330 回答