【问题标题】:How to get selected object only from an array如何仅从数组中获取选定对象
【发布时间】:2016-11-07 08:30:55
【问题描述】:

我有一个包含以下结构的文档的集合:

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

我想用电影name="fana"查询,回复应该是

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

如何使用 spring mongoTemplate 获得上述内容?

【问题讨论】:

    标签: spring mongodb aggregation-framework spring-mongodb mongotemplate


    【解决方案1】:

    你可以试试这样的。

    基于非聚合的方法:

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

    【讨论】:

    • 嗨 Veeram,现在电影大小已添加到电影数组中,如何检查小于条件
    • 没有 $elemMatch 我正在尝试,它给出了错误。如何处理没有 elemMatch
    • 你得到什么错误?请在帖子中添加您尝试过的内容。
    【解决方案2】:

    $unwind的mongodb聚合可以用于此。

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

    您可以尝试上述查询以获得所需的输出。

    【讨论】:

    • 感谢您的回复。如何在mongotemplate中实现它
    • 请告诉我如何在spring mongotemplate中实现
    【解决方案3】:

    以上方法为您提供了使用聚合和基本查询的解决方案。但是如果你不想使用 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-05-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多