MongoDB Concat在聚合中不起作用

vin*_*eet 1 mongodb mongodb-query aggregation-framework mongodb-aggregation

在我的查询中,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"----//
    }
  }

])
Run Code Online (Sandbox Code Playgroud)

这是查询输出:

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

   //--here i want that `myDate` should be "12-09-2016"----//
}
Run Code Online (Sandbox Code Playgroud)

在mongodb 中将createdOn字段数据存储为Date类型,即

在此处输入图片说明

chr*_*dam 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" } }   
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

如果使用的MongoDB版本2.6或更早版本不支持该$dateToString运算符,则需要两个$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"
                ] 
            }       
        }
    }
])
Run Code Online (Sandbox Code Playgroud)

或者更确切地说是一个以表达式为$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] }
                ] 
            }       
        }
    }
])
Run Code Online (Sandbox Code Playgroud)