文檔集合中的日期字段由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