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

Spring Boot-MongoDB聚合嵌套文档返回空结果

傅阳
2023-03-14

我有一个名为results的集合,其中每个文档都有一个标记(唯一)和一个嵌入文档(服务)列表。

样本:

{
    _id: ObjectId("61e7eed15b9df6f80f0164c0"),
    token: '7683af2f-8f93-4387-9b6a-c89840d9525f',
    providers: [
      {
        _id: 2,
        companyName: 'Autopro'
      }
    ],
    services: [
      {
        _id: 1,
        serviceTypeId: 103
      },
      {
        _id: 5,
        serviceTypeId: 103
      },
      {
        _id: 6,
        serviceTypeId: 103,
      }
    ]
}

我想使用mongo模板(spring boot)提取一个基于令牌和服务id的服务。下面是一个代码片段:

UnwindOperation unwindServicesOp = Aggregation.unwind("services");
ProjectionOperation projectionOp = Aggregation.project(Fields.fields("services")).andExclude("_id");
HashSet<Criteria> set = new HashSet<>();
set.add(Criteria.where("token").is(token));
set.add(Criteria.where("services._id").is(serviceId));
Criteria c = new Criteria();
c.andOperator(set);
MatchOperation matchOp = Aggregation.match(c);
return mongoTemplate.aggregate(Aggregation.newAggregation(Arrays.asList(unwindServicesOp, matchOp, projectionOp)),"results", Service.class).getUniqueMappedResult();

服务级别:


public class Service implements Serializable {
    private static final long serialVersionUID = -7786799739639015883L;
    
    @Id
    private Integer id;
    
    private Integer serviceTypeId;
//setter and getters omitted for simplicity
}

上面的代码执行此查询:

[{ "$unwind" : "$services"}, { "$match" : { "$and" : [{ "token" : "7683af2f-8f93-4387-9b6a-c89840d9525d"}, { "services._id" : 1}]}}, { "$project" : { "services" : 1, "_id" : 0}}]

方法返回空Service对象!

为了获得服务对象,我的聚合中是否有任何更改要做?

共有1个答案

太叔航
2023-03-14

为了解决这个问题,还有一个阶段(最后一个)要添加:

ReplaceRootOperation replaceRootOp = Aggregation.replaceRoot("services");

最后在聚合对象中添加它。

我工作。

 类似资料:
  • 多亏了这里的人的帮助,我成功地在我的文档中找到了两个ID,并在另一个集合中找到了他们的代表文档。我需要采取的下一步是进一步查找一个“嵌套”ID(引用另一个集合中的文档)。 其结果如下: 我希望chieftain部分是这样的(这就是没有添加'last'$lookup'的chieftain文档的样子):

  • 假设我有以下JSON结构,我希望按性别分组,并希望在同一字段中返回多个文档值: 现在我知道我可以做这样的事情,但是我需要把年龄和名字合并到一个字段中。

  • 问题内容: 我有这些猫鼬模式: 如何返回所有带有最新消息子文档(限制1)的线程? 目前,我正在服务器端过滤结果,但出于性能考虑,我想在MongoDb中移动此操作。 问题答案: 您可以使用,,并使用类似以下方式进行操作:

  • 问题内容: 我有这个映射: 而这个查询: 我等待25个结果,因为我有25个后索引。但是我得到一个空集。如果我删除嵌套的过滤器,一切正常。我希望能够过滤嵌套对象 在我的设置中,我有: 我在这里缺少什么。 谢谢 问题答案: 简短版本: 尝试此操作(更新端点和索引名称后): 它对我有用,并且简化了您的设置。稍后,我将发布带有较长解释的编辑。 编辑:长版: 查询的问题是分析器与查询中的过滤器结合在一起。您

  • 问题内容: 我如何在mongodb文档中嵌套文档的地方搜索文档。例如,我有一组私人消息。每条私人消息都有两个嵌套文档- 一个代表发送用户,另一个代表接收使用。两个嵌套文档的格式均为- userID:34343,名称:Joe Bloggs 我希望能够搜索用户发送的所有邮件(例如,搜索发件人用户的嵌套文档)。 我正在使用Java驱动程序。我是否需要创建一个代表嵌套文档的DBObject? 谢谢 问题答

  • 我想在具有指定 URL 的相应文档中将嵌套的“已爬行”更新为 True。 我对mongodb相当陌生,我似乎无法弄清楚这一点,非常感谢任何帮助。