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 回答
0

以上方法为您提供了使用聚合和基本查询的解决方案。但是,如果您不想使用 BasicObject 下面的代码将完美地工作:

Query query = new Query()
query.fields().elemMatch("movies", Criteria.where("name").is("Fana"));
List<Movies> movies = mongoTemplate.find(query, Movies.class);

此查询的缺点是它可能返回不同文档中存在的重复结果,因为超过 1 个文档可能与此条件匹配。因此,您可以在标准中添加 _id,如下所示:

Criteria criteria = Criteria.where('_id').is(movieId)
Query query = new Query().addCriteria(criteria)
query.fields().elemMatch("movies", Criteria.where("name").is("Fana"));
query.fields().exclude('_id')
List<Movies> movies = mongoTemplate.find(query, Movies.class);

我在响应中排除了文档的“_id”。

于 2019-07-30T09:08:29.427 回答