私の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"
}
ソースが公開されているデータセットとは異なるコレクションを取得する必要があります。私はこのクエリを試しましたが、うまくいきませんでした:
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());
_
しかし、それは例えば「サンプル」をリストの単一の要素として返すだけです。
別個のセットの「フィールド」が必要な場合は、代わりに.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インスタンスにあります。これには、パイプラインを構築するための多数のヘルパーメソッドがあります。しかし、これは少なくとも正しい方向にあなたを向けるべきです。
Spring Data Mongo 2.2.0の時点で、MongoTemplateは、条件付きの個別フィールドを取得する機能を提供します。
Criteria criteria = new Criteria("country").is("IN");
Query query = new Query();
query.addCriteria(criteria);
return mongoTemplate.findDistinct(query,"city",Address.class,String.class);
これは基本的に、国がINである住所コレクション内のすべての異なる都市を検索します。