拆分日期并仅在mongodb中更新年份

时间:2015-10-16 08:31:29

标签: mongodb date

我必须在所有集合中仅从日期字段更新年份。 我的收藏如下。

db.test.findOne()

{
        "_id" : ObjectId("52e8b96ce4b0e21f470e3851"),
        "requestNumber" : "RN-1007",
        "orderDate" : ISODate("2014-12-31T18:30:00Z"),
        "requiredByDate" : ISODate("2014-01-07T18:30:00Z")
}

我试图只使用聚合获得年份字段。

db.test.aggregate([{"$project" : { 'orderDate' : {'$year' : '$orderDate'}}}])

输出"orderDate" : 2014

如何更新2014年至2015年的年份而不更改月份,日期和时间戳?

1 个答案:

答案 0 :(得分:0)

您可以在 $add 管道中使用 $project 算术运算符。以下聚合操作使用 $add 表达式创建一个附加字段orderDateYearOlder,通过将365*24*60*60000毫秒(即365天)添加到日期部分来更新年份部分orderDate字段:

db.test.aggregate([
     { 
         "$project": { 
             "requestNumber": 1,              
             "requiredByDate" : 1,
             "orderDate" : 1,
             "orderDateYearOlder": { "$add": [ "$orderDate", 365*24*60*60000 ] } 
        } 
    }
])

示例输出

/* 0 */
{
    "result" : [ 
        {
            "_id" : ObjectId("52e8b96ce4b0e21f470e3851"),
            "requestNumber" : "RN-1007",
            "orderDate" : ISODate("2014-12-31T18:30:00.000Z"),
            "orderDateYearOlder" : ISODate("2015-12-31T18:30:00.000Z"),
            "requiredByDate" : ISODate("2014-01-07T18:30:00.000Z")            
        }
    ],
    "ok" : 1
}

另一种方法是使用 Bulk API 操作来更新集合中的日期字段,如下所示:

var bulk = db.test.initializeOrderedBulkOp(),   
    count = 0;

db.test.find({"orderDate": { "$exists": true, "$type": 9 }}).forEach(function(doc) { 
    var newOrderDate = new Date(doc.orderDate.getTime() + (365*24*60*60000));
    bulk.find({ "_id": doc._id }).updateOne({ 
        "$set": { "orderDate": newOrderDate }
    });
    count++;
    if (count % 100 == 0) {
        bulk.execute();
        bulk = db.test.initializeUnorderedBulkOp();
    }
});

if (count % 100 != 0) { bulk.execute(); }