MongoDB时间存储为字符串,如何过滤参数?

时间:2015-09-08 10:53:18

标签: mongodb mongodb-query

有一个数据集,遗憾的是时间不是作为日期时间的ISO格式存储,而是作为字符串存储,如

{"time" : "2015-08-28 09:24:30"}

有没有办法根据这个变量时间过滤记录?

将所有数据更改为时间戳是正确的方法之一,但没有它可以做到吗?

1 个答案:

答案 0 :(得分:2)

所以"真实"这里的答案是"不要这样做",因为转换你的"字符串"到了" BSON日期"是一个非常繁琐的过程。最好在mongodb shell中作为一个"一个关闭"操作:

var bulk = db.collection.initializeOrderedBulkOp(),
    count = 0;

db.collection.find({ "time": { "$type": 2 } }).forEach(function(doc) {
    bulk.find({ "_id": doc._id }).updateOne({
        "$set": { "time": new Date( doc.time.replace(" ","T") ) }
    });
    count++;

    if ( count % 1000 == 0 ) {
        bulk.execute();
        bulk = db.collection.initializeOrderedBulkOp();
    }
});

if ( count % 1000 != 0 )
    bulk.execute();

当然要调整" timezone"根据需要,但无论如何都是一个相当简单的案例。

然后所有"字符串"现在是BSON日期,您可以查询" day"例如:

db.collection.find({
    "time": { "$gte": new Date("2015-08-28"), "$lt": new Date("2015-08-29") }
})

并且只要传入的Date对象支持通过驱动程序进行序列化,就可以相对轻松地执行此操作,无论您的语法是什么。

但是,当然,只要你的字符串是" lexical" (这基本上意味着" yyyy-mm-dd hh:mm:ss")那么你实际上可以使用"范围"用"字符串值"代替:

db.collection.find({
    "time": { 
        "$gte": "2015-08-28 00:00:00", 
        "$lt": "2015-08-29 00:00:00"
    }
})

它有效,但它不是明智的"。

更改您的"字符串"到BSON日期。它需要的存储空间更少,而且没有任何问题。将数据转化为真实的"日期"对于您的语言API,当您实际需要它时。这项工作已经完成。