0

次の構造のドキュメントを含むコレクションがあります。

{
    "category": "movies",
    "movies": [
        {
          "name": "HarryPotter",
          "language": "english"
        },
        {
            "name": "Fana",
            "language": "hindi"
        }
    ]
}

映画でクエリを実行したいのですがname="fana"、応答は次のようになります

{
    "category": "movies",
    "movies": [
        {
            "name": "HarryPotter",
            "language": "english"
        }
    ]
}

spring mongoTemplate を使用して上記を取得するにはどうすればよいですか?

4

3 に答える 3

0

これには、mongodb 集約の$unwindを使用できます。

db.Collection.aggregate([{
   {$unwind : 'movies'},
   {$match :{'movies.name' : 'fana'}}
  }])

上記のクエリを試して、必要な出力を取得できます。

于 2016-11-07T08:41:54.243 に答える
0

このようなものを試すことができます。

非集計ベースのアプローチ:

public MovieCollection getMoviesByName() {
    BasicDBObject fields = new BasicDBObject("category", 1).append("movies", new BasicDBObject("$elemMatch", new BasicDBObject("name", "Fana").append("size", new BasicDBObject("$lt", 3))));
    BasicQuery query = new BasicQuery(new BasicDBObject(), fields);
    MovieCollection groupResults = mongoTemplate.findOne(query, MovieCollection.class);
    return groupResults;
}   

集計ベースのアプローチ:

import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import static org.springframework.data.mongodb.core.query.Criteria.where;

public List<BasicDBObject> getMoviesByName() {
     Aggregation aggregation = newAggregation(unwind("movies"), match(where("movies.name").is("Fana").and("movies.size").lt(1)),
        project(fields().and("category", "$category").and("movies", "$movies")));
     AggregationResults<BasicDBObject> groupResults = mongoTemplate.aggregate(
        aggregation, "movieCollection", BasicDBObject.class);
     return groupResults.getMappedResults();
}
于 2016-11-07T14:14:48.373 に答える