我可以用日期格式将字符串减去字符串吗?
示例:
我有两个字段:请求和响应(字符串格式:yyyy / mm / dd HH:mm:ss)。
我有记录:
{
_id: 1,
request: 2015/12/28 12:10:10,
response: 2015/12/28 12:10:15
}
并期待结果:
{
_id: 1,
duration: 5
}
我们可以将字符串转换为日期,然后使用$subtract
(聚合)来减去两个值吗?
我尝试搜索并找不到任何内容。
答案 0 :(得分:2)
要将字符串转换为日期格式,您必须从find()操作迭代结果并更新循环中的集合:
db.collection.find({}).forEach(function(doc) {
db.collection.update(
{ "_id": doc._id },
{
"$set": {
"request": new Date(doc.request),
"response": new Date(doc.response)
}
}
);
});
如果处理大型集合,上述更新操作的性能可能会受到影响,但使用 Bulk API 可以简化更新 通过减少发送到服务器的更新操作量来最大化效率,每1000个排队操作发送一次:
var bulk = db.collection.initializeOrderedBulkOp(),
counter = 0;
db.collection.find({
"request": { "$exists": true, "$type": 2 },
"response": { "$exists": true, "$type": 2 }
}).forEach(function(doc) {
bulk.find({ "_id": doc._id }).updateOne({
"$set": {
"request": new Date(doc.request),
"response": new Date(doc.response)
}
});
counter++;
if (counter % 1000 == 0) {
// Execute per 1000 operations and re-initialize every 1000 update statements
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
});
// Clean up queues
if (counter % 1000 != 0){
bulk.execute();
}
将字段更新为正确的日期格式后,您可以运行以下聚合管道以获得所需的结果:
db.collection.aggregate([
{
"$project": {
"duration": { "$subtract": [ "$response", "$request" ] }
}
}
])