mongodb mongoTemplate用一些标准获得不同的字段
我的MongoDB json结构是
{ "_id" : "122134231234234", "name" : "Total_pop", "description" : "sales category", "source" : "public", "dataset" :"d1" }, { "_id" : "1123421231234234", "name" : "Total_pop", "description" : "sales category", "source" : "public", "dataset" :"d1" }, { "_id" : "12312342332423343", "name" : "Total_pop", "description" : "sales category", "source" : "private", "description" : "d1" }
我需要获得不同的数据集的集合,其中source是公共的。 我试过这个查询,但它不起作用:
Criteria criteria = new Criteria(); criteria.where("source").in("public"); query.addCriteria(criteria); query.fields().include("name"); query.fields().include("description"); query.fields().include("description"); query.fields().include("source"); List list = mongoTemplate.getCollection("collectionname").distinct("source", query);
你能帮帮我吗?
首先, .getCollection()
方法返回基本的Driver集合对象,如下所示:
DBCollection collection = mongoTemplate.getCollection("collectionName");
因此查询对象的类型可能与您使用的不同,但也有一些其他的东西。 即.distinct()
仅返回您要求的密钥的“distint”值,并且不返回文档的其他字段。 所以你可以这样做:
Criteria criteria = new Criteria(); criteria.where("dataset").is("d1"); Query query = new Query(); query.addCriteria(criteria); List list = mongoTemplate.getCollection("collectionName") .distinct("source",query.getQueryObject());
但这只是将“sample”作为例子中的单个元素返回。
如果您想要来自不同集合的“字段”,请改用.aggregate()
方法。 对于不同键的其他字段值的“第一次”出现:
DBCollection colllection = mongoTemplate.getCollection("collectionName"); List pipeline = Arrays. asList( new BasicDBObject("$match",new BasicDBObject("dataset","d1")), new BasicDBObject("$group", new BasicDBObject("_id","$source") .append("name",new BasicDBObject("$first","$name")) .append("description", new BasicDBObject("$first","$description")) ) ); AggregationOutput output = colllection.aggregate(pipeline);
或者多个字段的实际“不同”值,使它们都成为分组键的一部分:
DBCollection colllection = mongoTemplate.getCollection("collectionName"); List pipeline = Arrays. asList( new BasicDBObject("$match",new BasicDBObject("dataset","d1")), new BasicDBObject("$group", new BasicDBObject("_id", new BasicDBObject("source","$source") .append("name","$name") .append("description","$description") ) ) ); AggregationOutput output = colllection.aggregate(pipeline);
mongoTemplate实例上还有一个直接的.aggregate()
方法,它有许多辅助方法来构建管道。 但这至少应该指向正确的方向。