V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐工具
RoboMongo
推荐书目
50 Tips and Tricks for MongoDB Developers
Related Blogs
Snail in a Turtleneck
lyris
V2EX  ›  MongoDB

MongoDB 里面日期查询的问题

  •  
  •   lyris · 2013-08-29 12:40:22 +08:00 · 18738 次点击
    这是一个创建于 4089 天前的主题,其中的信息可能已经有所发展或是发生改变。
    问题:
    原生控制台查不到结果,用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
    }
    })
    5 条回复    1970-01-01 08:00:00 +08:00
    juicy
        1
    juicy  
       2013-08-29 13:15:06 +08:00
    按照JavaScript这语言来分析,第一种是String类型,跟Date类型比较可能无法得到期望的结果吧。如果一定要用String类型,可能存的时候就存String类型就可以了吧。不过这样的明显没有用Date类型好啊~
    lyris
        2
    lyris  
    OP
       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
        3
    lyris  
    OP
       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
        4
    juicy  
       2013-08-29 13:46:44 +08:00
    lyris
        5
    lyris  
    OP
       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();
    }
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2561 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 15:33 · PVG 23:33 · LAX 07:33 · JFK 10:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.