文档集合中的日期字段由yyyymmdd格式的整数表示:例如, 20160407.有没有办法将它转换为日期作为聚合管道的一部分,以便它可以用相应的周数对文档进行分组?mongodb:将整数转换为日期
1
A
回答
1
在聚合管道中不可能。这里的一般前提是将数字表示转换为字符串等效,然后在循环中进行更新。对于循环,您将需要使用forEach()
方法或光标方法next()
访问文档的任何手动循环由find()
方法返回的光标。
在循环中,首先将字段转换为字符串格式,然后转换为“2016-04-07”等区域设置不敏感的日期格式。一旦你那么格式使用$set
运算符,如下面的例子,其中场被称为created_at
创建一个新的ISODate对象与和更新的领域,目前持有指定的数字格式YYYYMMDD日期:
var cursor = db.collection.find({"created_at": {"$exists": true, "$type": 1 }});
while (cursor.hasNext()) {
var doc = cursor.next(),
dateStr = doc.created_at.toString(),
dateStr.match(/(\d{4})(\d{2})(\d{2})/),
betterDateStr = match[2] + '-' + match[3] + '-' + match[1];
db.collection.update(
{"_id" : doc._id},
{"$set" : {"created_at" : new ISODate(betterDateStr)}}
)
};
为了提高性能,尤其是与大集合打交道时,需要使用Bulk API批量更新,你将分批发送操作的服务器的优势,说1000,让你更好的性能你没有发送每个请求到服务器,每1000个请求中只有一次。
以下演示了这种方法,第一个示例使用MongoDB版本>= 2.6 and < 3.2
中提供的Bulk API。它通过改变created_at
字段日期字段更新集合中的所有 文件:
var bulk = db.collection.initializeUnorderedBulkOp(),
counter = 0;
db.collection.find({"created_at": {"$exists": true, "$type": 1 }}).forEach(function (doc) {
var dateStr = doc.created_at.toString(),
dateStr.match(/(\d{4})(\d{2})(\d{2})/),
betterDateStr = match[2] + '-' + match[3] + '-' + match[1];
newDate = new ISODate(betterDateStr);
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "created_at": newDate}
});
counter++;
if (counter % 1000 == 0) {
bulk.execute(); // Execute per 1000 operations and re-initialize every 1000 update statements
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// Clean up remaining operations in queue
if (counter % 1000 != 0) { bulk.execute(); }
下一个例子适用于新的MongoDB版本3.2
这已经deprecated the Bulk API,并提供了新的一套使用bulkWrite()
的API:
var bulkOps = [];
db.collection.find({"created_at": {"$exists": true, "$type": 1 }}).forEach(function (doc) {
var dateStr = doc.created_at.toString(),
dateStr.match(/(\d{4})(\d{2})(\d{2})/),
betterDateStr = match[2] + '-' + match[3] + '-' + match[1];
newDate = new ISODate(betterDateStr);
bulkOps.push(
{
"updateOne": {
"filter": { "_id": doc._id } ,
"update": { "$set": { "created_at": newDate } }
}
}
);
})
db.collection.bulkWrite(bulkOps);
相关问题
- 1. 将日期转换为MongoDB ISO日期
- 2. 熊猫将整数转换为日期
- 3. 将当前日期转换为整数
- 4. 如何将日期转换为整数?
- 5. 如何将整数转换为日期?
- 6. Python将整数转换为日期
- 7. 将整数字符串日期转换为实际日期
- 8. 将Access 2003日期编号(整数)转换为Java日期
- 9. MongoDb日期转换
- 10. 将日期数转换为日期
- 11. SQL日期值转换为整数
- 12. 将日期字符串转换为完整日期
- 13. 在SQL Server中将日期编号转换为完整日期
- 14. 如何将mongodb聚合中的毫秒数转换为日期?
- 15. mongodb中的日期转换
- 16. MongoDb的Hive转换日期
- 17. 将数值转换为yyyymm日期为
- 18. 将日期转换为varchar,然后将其转换回日期
- 19. 将整数列替换为日期R
- 20. 将日期转换为日期串行
- 21. 将MySQL日期转换为Java日期
- 22. 将linq日期转换为短日期
- 23. 将UTC日期秒转换为日期
- 24. PHP - 将日期转换为UTC日期
- 25. 将SQL日期转换为SAS日期
- 26. SQL如何将数字(整数)转换为日期?
- 27. 如何将整数转换为日期数组?
- 28. 将DAAppearanceTime转换为日期
- 29. 将_NSCFString转换为日期
- 30. 将日期转换为nvarchar?
不,这根本不可能。你应该考虑改变你的文件结构。 – styvane