当前位置: 首页 > 知识库问答 >
问题:

使用Spring data mongodb的1.3.5版本,Spring data mongodb聚合函数不起作用

袁轶
2023-03-14

我需要使用spring数据过滤mongodb中的文档,该数据包含nexted数组。我在mongo shell上使用以下聚合查询,它运行良好。但当我通过springdata聚合操作触发该操作时,我得到的是空响应。mongo查询的工作原理是:

db.searchResource.aggregate({$match:{"_id" : ObjectId("53cf4e3dae92ac6561807f6d")}},{$project:{"rssSearchResponse.journeys":1}},{$unwind : "$rssSearchResponse.journeys"},{$match:{"rssSearchResponse.journeys.stops":0}});

我正在使用但不工作的Spring数据代码

TypedAggregation<SearchResource> aggregation = Aggregation.newAggregation(SearchResource.class, Aggregation.match(new Criteria("_id").is(new ObjectId(searchId))),
                Aggregation.project("rssSearchResponse.journeys"),
                Aggregation.unwind("rssSearchResponse.journeys"),
                Aggregation.match(new Criteria("rssSearchResponse.journeys.stops").is(0))
                );
AggregationResults<SearchResource> result = mongoOperations.aggregate(aggregation, JourneyInformation.class);

我尝试打破这个聚合函数,它能够项目rssSearchResponse.journeys但$unWind后,它返回空结果。

非常感谢您的帮助。

共有2个答案

郑俊材
2023-03-14
 match(where("_id").is(rs.id)) 

Mongo聚合中不起作用

您必须将rs.id转换为ObjectId

match(where("_id").is(new ObjectId(rs.id))) 
贾兴学
2023-03-14

怎么样:

@Test
public void foo() {

    mongoTemplate.dropCollection(RssSearchResponse.class);

    RssSearch rs = new RssSearch();
    rs.id  = "123";
    rs.rssSearchResponse = new RssSearchResponse(
            new Journey[] {new Journey("A", 1),new Journey("B", 0),new Journey("C", 0),new Journey("D", 1)}
    );

    mongoTemplate.insert(rs);

    Aggregation agg = newAggregation(RssSearch.class, //
          match(where("_id").is(rs.id)) //
        , project("rssSearchResponse.journeys") //
        , unwind("journeys") //
        , match(where("journeys.stops").is(0)) //
    );

    AggregationResults<DBObject> result = mongoTemplate.aggregate(agg, RssSearch.class, DBObject.class);
    System.out.println(result);

}

static class RssSearch{
    String id;
    RssSearchResponse rssSearchResponse;
}

static class RssSearchResponse{
    Journey[] journeys;

    public RssSearchResponse(Journey[] journeys) {
        this.journeys = journeys;
    }
}

static class Journey{
    String name;
    int stops;

    public Journey(String name, int stops) {
        this.name = name;
        this.stops = stops;
    }
}

这将返回B和C。

我们生成以下聚合命令:

{ 
    "aggregate" : "rssSearch" 
  , "pipeline" : [ 
     { "$match" : { "_id" : "123"}} 
   , { "$project" : { "journeys" : "$rssSearchResponse.journeys"}}
   , { "$unwind" : "$journeys"}
   , { "$match" : { "journeys.stops" : 0}}
  ]
}
 类似资料:
  • 本文向大家介绍SpringDataMongoDB多文档事务的实现,包括了SpringDataMongoDB多文档事务的实现的使用技巧和注意事项,需要的朋友参考一下 一、安装MongoDB4.0.3(××) 1.1、官方安装文档 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 1.2、tar.gz包下载地址 h

  • 我有一个工作函数应用,它获取了一个 blob 输入和一个事件中心输出(在 beta 版中工作)。随着最新更改,我的函数不再起作用。我已尝试根据发行说明更新host.json文件,但它没有引用blob触发器: 此外,当Microsoft.NET.Sdk.Functions从1.0.14升级到1.0.19时,无法识别bbloTrigger属性,我的代码将无法编译: 如前所述,这是因为最近的Azure

  • 我使用SpringDataMongo作为ORM来访问我的MongoDb。我需要阅读一个MongoDb集合,其中包含我不管理内容及其有效性的文档。我面临一个问题:文档并非都是有效的,当我使用“findAll”方法时,我只捕获了一个异常。我希望找到所有有效的文档并拒绝无效的文档,而不是这种行为。 例如,我有一个带有原始布尔值的bean,在文档中,该字段被设置为String类型。因此,当我使用findA

  • 我使用的是morphia 0.109,并定义了一个基类,如下所示: 和预期的Morphia实体 null 编辑以添加:我正在使用的保存过程:

  • 我想在JAVA API中编写elasticsearch聚合代码,以查找字段折叠和结果分组。 json聚合代码如下所示,我从elasticsearch文档中获得了这些代码 “dedup\u by\u score”聚合具有称为“top\u hit”聚合的子聚合,并将此聚合用于桶排序。 我想将这个json查询转换为JAVA 这是我已经在JAVA中尝试过的 但是我从Elasticsearch得到了如下错误

  • 我有两个集合。如果集合2中的1号和2号在集合1中指定的一定范围内,我正在尝试将集合2的文档添加到集合1中。集合1中的FYI ObjectId和集合2中的ObjectId指的是两个不同的项目/产品,因此我无法在此id上加入两个集合。 集合1中的示例文档: 集合2中的示例文档: 我想要输出: 我认为使用管道的查找阶段可以工作。我的代码当前如下: 但是运行上面的没有给我输出。我做错了什么吗??