web-dev-qa-db-ja.com

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

ソースが公開されているデータセットとは異なるコレクションを取得する必要があります。私はこのクエリを試しましたが、うまくいきませんでした:

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

手伝ってくれませんか?

11
Raj

まず、.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インスタンスにあります。これには、パイプラインを構築するための多数のヘルパーメソッドがあります。しかし、これは少なくとも正しい方向にあなたを向けるべきです。

15
Blakes Seven

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である住所コレクション内のすべての異なる都市を検索します。

3
user3009002