在mongodb查询之间(范围)不起作用

时间:2014-11-22 03:56:45

标签: mongodb-query

我有一个db doc如下:

enter image description here

现在我尝试按时间间隔对所有信息进行分组2个特定时间并返回计数总和

为此我写了我的代码如下:

DBCollection coll = db.getCollection("test");
    DBObject groupFields = new BasicDBObject("_id", "$time");
    groupFields.put("sum", new BasicDBObject("$sum", "$count"));
    DBObject group = new BasicDBObject("$group", groupFields);
    // filter where clause
    BasicDBObject simpleQuery = new BasicDBObject();
    simpleQuery.put("time", new BasicDBObject("$gt", "20140005150011"));
    simpleQuery.put("time", new BasicDBObject("$lt", "20151105150011"));
    DBObject match = new BasicDBObject("$match", simpleQuery);
    List<DBObject> pipeline = Arrays.asList(match, group);
    AggregationOutput output = coll.aggregate(pipeline);
    for (DBObject result : output.results()) {
        System.out.println(result);

当我运行此代码时,它按所有元素分组,即使是从2013年开始的那些时间......但是在simpleQuery中我定义了一个显然不起作用的范围。但是一旦我删除 simpleQuery.put(“time”,new BasicDBObject(“$ lt”,“20151105150011”));代码开始工作。为什么会这样?有人可以帮忙吗?

Update1:​​

似乎在下面的查询中第二个覆盖了第一个:

     simpleQuery.put("time", new BasicDBObject("$gt", "20140005150011"));
     simpleQuery.put("time", new BasicDBObject("$lt", "20151105150011"));

因为当我更改查询时它开始工作

更新2:

当我将代码更改为以下代码时,它完全有效:

BasicDBObject andQuery = new BasicDBObject();
    simpleQuerytest.put("time", new BasicDBObject("$gt", "20130005150011"));
    simpleQuery.put("time", new BasicDBObject("$lt", "20151105150011"));

      List<BasicDBObject> obj = new ArrayList<BasicDBObject>();
      obj.add(simpleQuerytest);
      obj.add(simpleQuery);
      andQuery.put("$and", obj);

现在我的问题是和查询之间有什么区别,只是使用put?我一直认为他们是一样的!!!任何人都可以解释一下吗?

1 个答案:

答案 0 :(得分:1)

引用变量simpleQuery指向BasicDBObject的实例,该实例是Map的实现。从java文档中,当您将一个键值对放入地图时,它就是

  

将指定的值与此映射中的指定键相关联   (可选操作)。 如果地图以前包含地图   键,旧值被指定值替换。(地图m是   据说当且仅当m.containsKey(k)包含密钥k的映射   会回来的。)

第一个操作:

simpleQuery.put("time", new BasicDBObject("$gt", "20140005150011"));

将键time与值相关联。

第二次操作,

simpleQuery.put("time", new BasicDBObject("$lt", "20151105150011"));

替换time的上一个值。因此,只有time的最后插入值与之关联。

以下操作按预期工作,因为simpleQuerytestsimpleQuery是两个不同的地图,它们构成了包含map操作的and的输入。

BasicDBObject andQuery = new BasicDBObject();
simpleQuerytest.put("time", new BasicDBObject("$gt", "20130005150011"));
simpleQuery.put("time", new BasicDBObject("$lt", "20151105150011"));
...
andQuery.put("$and", obj);