有一个数据集,遗憾的是时间不是作为日期时间的ISO格式存储,而是作为字符串存储,如
{"time" : "2015-08-28 09:24:30"}
有没有办法根据这个变量时间过滤记录?
将所有数据更改为时间戳是正确的方法之一,但没有它可以做到吗?
答案 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,当您实际需要它时。这项工作已经完成。