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()方法,它有许多辅助方法来构建管道。 但这至少应该指向正确的方向。