如何将字符串转换为日期然后在mongoose查询中减去日期?

时间:2015-12-28 04:51:56

标签: sql mongodb date mongoose

我可以用日期格式将字符串减去字符串吗?

示例:

我有两个字段:请求和响应(字符串格式: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(聚合)来减去两个值吗?

我尝试搜索并找不到任何内容。

1 个答案:

答案 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" ] }
        }
    }
])