我必须在所有集合中仅从日期字段更新年份。 我的收藏如下。
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年的年份而不更改月份,日期和时间戳?
答案 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(); }