一つには、.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());
ただし、これは、たとえばリスト内の単一の要素として「サンプル」を返すだけです。
個別のセットの「フィールド」が必要な場合は、.aggregate()
を使用します 代わりにメソッド。個別のキーの他のフィールド値が「最初に」出現した場合:
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);
または、複数のフィールドの実際の「個別の」値をすべてグループ化キーの一部にすることにより、次のようになります。
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);
直接の.aggregate()
もあります すでにmongoTemplateインスタンスのメソッドであり、パイプラインを構築するための多数のヘルパーメソッドがあります。しかし、これは少なくともあなたを正しい方向に向けるはずです。