我在MongoDB中有大约500,000个条目的集合。
每个条目都有一个属性Date,格式如下: “日期”:“21/01/2005”
我想知道如何将其转换为日期格式,这样我就可以将其编入索引(旧 - 新)并按年查询条目。
我试过了:
db.collection.find().forEach(function(element){
element.OrderDate = ISODate(element.OrderDate);
db.collection.save(element);
})
但这似乎只是将Date属性更改为今天的日期,以及以下格式的时间: “日期”:ISODate(“2016-02-11T11:41:45.680Z”)
提前谢谢你。
答案 0 :(得分:2)
通过在给定分隔符上拆分字符串,将字段转换为正确的日期对象。使用 parseInt()
将字符串转换为数字, new Date()
构造函数构建 Date
那些部分:第三部分是年份,第二部分是月份,第一部分是一天。由于 Date
使用从零开始的月份数字,因此您必须从月份数字中减去一个。
以下演示了这种方法:
var cursor = db.collection.find({"OrderDate": {"$exists": true, "$type": 2 }});
while (cursor.hasNext()) {
var doc = cursor.next();
var parts = doc.OrderDate.split("/");
var dt = new Date(
parseInt(parts[2], 10), // year
parseInt(parts[1], 10) - 1, // month
parseInt(parts[0], 10) // day
);
db.collection.update(
{"_id": doc._id},
{"$set": {"OrderDate": dt}}
)
};
为了提高性能,尤其是在处理大型集合时,请利用 Bulk API 进行批量更新,因为您将以500个批量发送操作到服务器您可以获得更好的性能,因为您不是每次请求都向服务器发送每个请求。
以下演示了此方法,第一个示例使用MongoDB版本>= 2.6 and < 3.2
中提供的批量API。它更新所有
通过将OrderDate
字段更改为日期字段来收集集合中的文档:
var bulk = db.collection.initializeUnorderedBulkOp(),
counter = 0;
db.collection.find({"OrderDate": {"$exists": true, "$type": 2 }}).forEach(function (doc) {
var parts = doc.OrderDate.split("/");
var dt = new Date(
parseInt(parts[2], 10), // year
parseInt(parts[1], 10) - 1, // month
parseInt(parts[0], 10) // day
);
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "OrderDate": dt}
});
counter++;
if (counter % 500 == 0) {
bulk.execute(); // Execute per 500 operations and re-initialize every 500 update statements
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// Clean up remaining operations in queue
if (counter % 500 != 0) { bulk.execute(); }
下一个示例适用于自 deprecated the Bulk API 以来的新MongoDB版本3.2
,并使用 bulkWrite()
提供了一套更新的api强>:
var bulkOps = db.collection.find({"OrderDate": {"$exists": true, "$type": 2 }}).map(function (doc) {
var parts = doc.OrderDate.split("/");
var dt = new Date(
parseInt(parts[2], 10), // year
parseInt(parts[1], 10) - 1, // month
parseInt(parts[0], 10) // day
);
return {
"updateOne": {
"filter": { "_id": doc._id } ,
"update": { "$set": { "OrderDate": dt } }
}
};
})
db.collection.bulkWrite(bulkOps);