我有一个db doc如下:
现在我尝试按时间间隔对所有信息进行分组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?我一直认为他们是一样的!!!任何人都可以解释一下吗?
答案 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
的最后插入值与之关联。
以下操作按预期工作,因为simpleQuerytest
和simpleQuery
是两个不同的地图,它们构成了包含map
操作的and
的输入。
BasicDBObject andQuery = new BasicDBObject();
simpleQuerytest.put("time", new BasicDBObject("$gt", "20130005150011"));
simpleQuery.put("time", new BasicDBObject("$lt", "20151105150011"));
...
andQuery.put("$and", obj);