2015-07-26 24 views
8

Benim MongoDB json yapısı Ben kaynak kamu olduğu veri kümesinin farklı koleksiyon almak gerekirmongodb mongoTemplate

{ 
    "_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" 
} 

bazı kriterlere ayrı alanını olsun. ben bu sorguyu denedim ve işe yaramadı:

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); 

bana yardımcı misiniz?

+0

"; Liste listesi ="? –

cevap

9

Bir kere .getCollection() yöntem temel Sürücü toplama nesne şöyle verir:

DBCollection collection = mongoTemplate.getCollection("collectionName"); 

Yani sorgu nesnenin türü kullandığınız olduğundan farklı olabilir, ama başka şeyler de vardır. Yani, .distinct(), yalnızca istediğiniz anahtarın "distint" değerlerini döndürür ve belgenin diğer alanlarını döndürmez. Bu nedenle:

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()); 

Ancak bu, örneğin, örneğin "örnek" öğesini listedeki tek bir öğe olarak döndürecek.

"Alanları" ayrı bir kümeden istiyorsanız, bunun yerine .aggregate() yöntemini kullanın.

DBCollection colllection = mongoTemplate.getCollection("collectionName"); 

    List<DBObject> pipeline = Arrays.<DBObject>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); 
: Onlara gruplama anahtar her parçası yaparak

DBCollection colllection = mongoTemplate.getCollection("collectionName"); 

    List<DBObject> pipeline = Arrays.<DBObject>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); 

Veya birden alanların asıl "farklı" değerler: farklı anahtar için diğer alan değerleri "ilk" oluşumları ya ile

Ayrıca, boru hatları oluşturmak için çok sayıda yardımcı yönteme sahip olan mongoTemplate örnekleri üzerinde bir doğrudan .aggregate() yöntemi de vardır. Ama bu sizi en azından doğru yönde göstermelidir.