【问题1】 对结果集的分组
我的需求:对一个表进行条件查询,对符合条件的结果按一个字段进行分组,用java实现。
我看文档中是这样用的:
db.collectionspace.collection.aggregate({$group:{_id:"$major",avg_score:{$avg:"$score"},Major:{$first:"$major"}}})
返回的数据是:
{ "avg_score": 82, "major": "光学"}{ "avg_score": 77.25, "major": "物理学"}
但是java 接口的原型是这样的:
这个obj参数怎么传,list中每一个元素都是依次对上次操作的结果进行在进行操作?
【问题2】:
我还有个查询的需求,查询的matcher是稍微比较复杂的结构,有多个参数需要比较,且按照$and和$or组合在一起。不考虑建立索引,这样的方式比直接查询一个简单的matcher的效率慢一点还是慢一个甚至几个量级?
我猜测查询的过程是遍历每条记录对matcher进行适配,所以不管matcher多复杂,也就是比较时多一点的开销(比较的开销),不会导致很严重的慢(需要来回读取几遍原始数据),是否这样?
另外,我的matcher可能是类似 : $and:{条件A , 条件B,...},若前面的条件A不满足,就不用比较后面的条件了,加快速度,是否这样?
【问题3】
queryOne和query接口参数有一个flag字段:
the flag is used to choose the way to query, the optional options are as below:
源码中,queryOne可以采用:
*
* BDQuery.FLG_QUERY_STRINGOUT (Normally, query return bson stream, when this flag is added, query return binary data stream)
* BDQuery.FLG_QUERY_FORCE_HINT (Force to use specified hint to query,if database have no index assigned by the hint, fail to query)
* BDQuery.FLG_QUERY_PARALLED (Enable paralled sub query)
query可以采用:
* DBQuery.FLG_QUERY_STRINGOUT
* DBQuery.FLG_QUERY_FORCE_HINT
* DBQuery.FLG_QUERY_PARALLED
* DBQuery.FLG_QUERY_WITH_RETURNDATA ( return data in query response)
* DBQuery.FLG_QUERY_EXPLAIN (explain query)
这几种flag起什么作用,尤其是DBQuery.FLG_QUERY_PARALLED。
我采用3个物理结点,分成三个组。表shard分区键映射到不同分组进行存储,每个组里面就一个副本。DBQuery.FLG_QUERY_PARALLED会加快查询吗?怎么个加快法呢,大致原理是什么(按不同分组并行加快,还是同一分组的不同副本并行加快,我这种场景能否加快查询)?
每个问题都不是很big,干脆攒一起问下吧。
多谢版主。