使用比较查询运算符形成查询,从groovy形成ISODate以从mongodb获取数据

时间:2013-07-03 14:09:14

标签: mongodb grails groovy gorm

以下是我在mongodb中的eventSchedule集合中的示例JSON:

/* 0 */
{
  "_id" : ObjectId("51cd841b8b757a8c4c3b0af9"),
  "type" : "evo",
  "eventInfo" : {
    "title" : "My title",
    "field1" : "MyField1",
    "schedule" : {
      "fromDate" : ISODate("2013-07-19T04:00:00Z"),
      "toDate" : ISODate("2013-07-25T20:00:00Z")
    }
  },
  "locationName" : "Loc1"
}

我想查询此集合,并在当前日期之后获取所有带有日程字段“fromDate”的eventSchedules。

在mongoVUE中,以下查询有效:

db.eventSchedule.find({ "eventInfo.schedule.fromDate" : { "$gte" : ISODate("2012-04-29T00:00:00Z") } }).limit(50);

我正在尝试从我的一个grails控制器中执行此操作:

    def curDate= new Date()
    def sdf= new SimpleDateFormat("yyyy-mm-dd")
    def curFormattedDate= sdf.format(curDate)
    def queryVal=  "{\$gte : ISODate(\""+curFormattedDate+"T00:00:00.000Z\")}"
    query.put("eventInfo.schedule.fromDate:", queryVal.trim())
    DBObject a = db.eventSchedule.findOne(query)
    println a

上面的代码返回a的值为null。请注意,如果我从queryVal删除括号,那么它也不起作用。所以任何人都可以帮我在groovy中形成适当的查询吗?

1 个答案:

答案 0 :(得分:0)

您需要纠正创建查询的几个方面:

    日期格式中的
  1. mm表示分钟而非月份。请改用MM
  2. 如果你真的想坚持使用mongoVUE版本,你是否需要为"逃脱$gte
    def queryVal= "{\"\$gte\" : ISODate(\""+curFormattedDate+"T00:00:00.000Z\")}"
  3. 顺便说一句,格式化日期的更加通俗的方式是

    def currentFormattedDate = new Date().format('yyyy-MM-dd')