MongoDB 里面日期查询的问题

2013-08-29 12:40:22 +08:00
 lyris
问题:
原生控制台查不到结果,用Java驱动可以。MongoDB shell version: 2.4.6

具体情况是:
DB:ecommerce, Collection为products,
1.shell命令查不出来结果:
use ecommerce
db.products.find({ "manufacture_details.release_date" : { "$gte" : { "$date" : "2012-05-17T08:14:15.000Z"}}});

2.但是用Java MongoDB Driver 查询,就可以出来,
trace info 显示:find: ecommerce.products { "manufacture_details.release_date" : { "$gte" : { "$date" : "2012-05-17T08:14:15.000Z"}}}
可以查到结果。

3. 用 这种shell命令可以查询到结果:
use ecommerce
db.products.find({"manufacture_details.release_date": {"$gte": new ISODate("2012-05-17 08:14:15.656")}});

但是本人不需要3这种写法,想把1这种写法调通,

测试数据:
mongo
use ecommerce
db.products.insert({
sku: "111445GB3",
title: "Simsong One mobile phone",
description: "The greatest Onedroid phone on the market .....",

manufacture_details: {
model_number: "A123X",
release_date: new ISODate("2012-05-17T08:14:15.656Z")
},

shipping_details: {
weight: 350,
width: 10,
height: 10,
depth: 1
},

quantity: 99,

pricing: {
price: 1000
}
})
18612 次点击
所在节点    MongoDB
5 条回复
juicy
2013-08-29 13:15:06 +08:00
按照JavaScript这语言来分析,第一种是String类型,跟Date类型比较可能无法得到期望的结果吧。如果一定要用String类型,可能存的时候就存String类型就可以了吧。不过这样的明显没有用Date类型好啊~
lyris
2013-08-29 13:34:14 +08:00
@juicy 有道理,谢谢。
现在我如果吧 {"manufacture_details.release_date": {"$gte": new ISODate("2012-05-17 08:14:15.656")}} 这个直接给Java 代码的话,JSON都pass不过, 发愁
如:
queryStr = "{\"manufacture_details.release_date\": {\"$gte\": new ISODate(\"2012-05-17 08:14:15.656\")}}";
DBObject queryObject = (DBObject) JSON.parse(queryStr);
cursor = collection.find(queryObject);
直接抛异常:
Exception in thread "main" com.mongodb.util.JSONParseException:
{"manufacture_details.release_date": {"$gte": new ISODate("2012-05-17 08:14:15.656")}}
lyris
2013-08-29 13:45:43 +08:00
看来java如果要直接兼容mongo shell 里面的手写查询,只能来个正则把形如new ISODate("2012-05-17 08:14:15.656") 这种直接翻译成 { "$date" : "2012-05-17T08:14:15.656Z"} 得了,日期类型真是麻烦。
juicy
2013-08-29 13:46:44 +08:00
lyris
2013-08-29 14:10:32 +08:00
嗯,谢谢!

JavaScript(MongoDB Shel)里面用 new ISODate() 来将字符串转化为Date类型,
对应Java 里面用 new BasicDBObject("ts", date);
这样就恍然大悟了。

原来还以为BasicDBObject 生成的toString()可以直接给MongoDb 的JavaScript Shell拿来用呢,发现还不是,至少JSON规范里面就不能处理 new ISODate 这种内建函数。

Java里面代码很累赘,不过用Java还是喜欢它的速度和编译检查。


SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
try {
Date date = sdf.parse("2012-05-17T08:14:15.656Z");
BasicDBObject time = new BasicDBObject("ts", date); //实际上这里面"ts" 可以为任意键值
System.out.println(time.toString());
} catch (ParseException e) {
e.printStackTrace();
}

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/80624

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX