如何从Cloudant DB中检索日期范围内的记录

时间:2016-05-06 15:56:12

标签: ibm-cloud websphere-liberty cloudant

我在CloudantDB中存储了以下对象。

 SystemLog: 
     {
     "logContext":"ARTLogging",
     "logTime":2016-05-04T22:33:02Z,
     "logReference":"CloudantARTManager",
     "log":"Hello world. Test Message",
     "status":"Success"
     }

cloudantdb具有以下索引:

 {
  "name":"SysLogIdx1",
  "ddoc":"SysLogIdx1",
  "index":{"fields":
                [
                  {"logContext":"asc"},
                  {"logTime":"asc"},
                  {"logReference":"asc"}
                 ]
          }
}   

我正尝试使用过滤器在2分钟范围内检索这些日志,如下所示

 "selector": {
            "logContext": "ARTLogging", 
            "logTime": {"$gt": "2016-05-04T22:32:02Z"}, 
            "logTime": {"$lt": "2016-05-04T22:34:02Z"}, 
            "logReference": "CloudantARTManager"
            }

我也试过这个

"selector": 
    {"logContext": "ARTLogging", 
     "logTime": {"$gt": "2016-05-04T22:32:02Z", "$lt": "2016-05-04T22:34:02Z"}, 
     "logReference": "CloudantARTManager"
    }

db.find没有选择任何记录。但是,如果我删除logTime过滤器,我正确地获取记录。我究竟做错了什么。

由于 马杜

1 个答案:

答案 0 :(得分:0)

看起来您无法在日期字段上执行范围。所以我在SystemLog中创建了另一个字段,如下所示:

  long logLongTime = logTime.getTime(); // here logTime is a java.util.Date.

然后我添加了一个索引字段,如下所示:

db.createIndex("SysLogIdx2", "SysLogIdx2", null, new IndexField[]{
                       new IndexField("logContext",SortOrder.asc),
                       new IndexField("logLongTime",SortOrder.asc),
                       new IndexField("logReference",SortOrder.asc)});

接下来,我更新了我的选择器字符串,如下所示:

"selector": 
        {"logContext": "ARTLogging", 
        "logLongTime": {"$gte": 1462569436000, "$lte": 1462569556000}, 
        "logReference": "CloudantARTManager"
        }   

然后db.find检索到正确的记录。

由于 马杜