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

嵌入式文档中的Spring mongo切片数组

阎德辉
2023-03-14

嵌入式文档中数组聚合的切片方法不适合我使用Spring mongo模板。

示例:

发票收款:

{
  "reference_number": "aaa111",
  "historical_data": {
    "year": 2010,
    "data": [
      {
        "item_name": "Apple",
        "price": 50
      },
      {
        "item_name": "Book",
        "price": 200
      }
    ]
  }
}

使用mongoTemplate,我希望只获取切片中的历史数据。

对于需要切片直接出现在根下面的数组,我找到了使用聚合的解决方案。参考:Spring mongo仓库切片

对嵌入文档中的数组应用类似的查询,即使有数据,也会返回空列表。

我尝试的查询是:

TypedAggregation<Invoice> agg = newAggregation(Invoice.class,
                match(where("reference_number").is(referenceNumber)),
                project.andExpression("historicalData.data").slice(limit, offset));
        AggregationResults<Invoice> result = mongoTemplate.aggregate(agg, Invoice.class, Invoice.class);

但这将返回一个空的数据列表。

我nvoice.java

@Data
@Document(collection = "invoice")
public class Invoice {

    @Id
    private String id;

    @NotEmpty
    @Indexed(unique = true)
    @Field("reference_number")
    private String referenceNumber = UUID.randomUUID().toString();

   @Valid
    @Field("historical_data")
    private HistoricalData historicalData = new HistoricalData();
}

历史数据:

@Data
public class HistoricalData {
    @NotEmpty
    @Field("year")
    private Intger year;
    @Valid
    @NotNull
    @Field("data")
    private List<InvoiceData> data = new LinkedList<>();
}

注意:我也尝试过:

TypedAggregation<Invoice> agg = newAggregation(Invoice.class,
                match(where("reference_number").is(referenceNumber)),
                project.andExpression("historical_data.data").slice(limit, offset));
        AggregationResults<Invoice> result = mongoTemplate.aggregate(agg, Invoice.class, Invoice.class);

但这给了我一个PropertyPathexException。

提前谢谢!!

共有1个答案

楚举
2023-03-14

经过几周的努力,我想出了一个解决办法:

ProjectionOperation project = project().and("historicalRevisionData.data").slice(limit, offset).as("historical_revision_data.data")
                .andInclude("id")
                .and("referenceNumber").as("reference_number");
TypedAggregation<Invoice> agg = newAggregation(Invoice.class,
                match(where("reference_number").is(referenceNumber)),
                project);
AggregationResults<TaxInvoice> aggregate = mongoTemplate.aggregate(agg, Invoice.class, Invoice.class);

希望这也能帮助别人。

 类似资料:
  • 我有一个问题'XWPF文档'。程序的一部分获取docx文件,并将其中的所有内容复制到一个输出docx文件中。包括文字、表格、图片和公式。我在这方面有一个很好的结果,但是最近我有一个错误:一张图片没有复制到结果中。这是源代码,这是结果。结果你可以看到“3.1.6.2”部分的哪些图像被成功复制,但是不在“3.1.6.1”。 我是这样做的: 这里的关键是: 我从'运行'得到嵌入的图片。在坏的文件中,我有

  • 您可以在Perl模块和脚本中嵌入Pod(Plain Old Text)文档。 以下是在Perl代码中使用嵌入式文档的规则 - 使用空行开始您的文档,在开头使用a = head1命令,然后使用= cut结束它 Perl将忽略您在代码中输入的Pod文本。 以下是在Perl代码中使用嵌入式文档的简单示例 - #!/usr/bin/perl print "Hello, World\n"; =head1 H

  • 我有一个由“记事本”组成的meteor应用程序,每个记事本都包含一组“笔记”,可以在任何位置插入、删除或编辑行。该数组包含在一个对象中,该对象包含各种其他信息(例如名称、用户等)。主文档中的每个对象都将包含其中一个数组。例如: 是否有任何方法可以将“注释”作为其自己的集合传递给我的客户,以便客户可以直接编辑它,就像它没有嵌入一样?如果每次我想更新时都需要将完整的notes数组传递给服务器,我担心性

  • 我用Mongoose定义了以下模式: 我尝试执行以下查询: 查询不响应,并且从不进入回调函数。这很奇怪,因为这种类型的查询(搜索两个字符串字段)适用于我定义的另一个模式,但不适用于这个模式。另一种模式更简单,不需要任何嵌入文档。 [更新] 我试过你的建议,但不行。我认为只有两个选择: 1.我发布的模式有问题。 多谢!

  • 问题内容: 我浏览了猫鼬API,以及关于SO和google小组的许多问题,但仍然无法弄清更新嵌入式文档。 我正在尝试使用args的内容更新此特定的userListings对象。 以下是架构: 此发现也不起作用,这可能是第一个问题: 返回: 那应该等同于此mongo客户呼叫: 运行: 问题答案: 当您已有用户时,您可以执行以下操作: 如在这里找到:http : //mongoosejs.com/do

  • 现在我想做的是将一个GeoStamps列表推送到Mongo中的GeoStamp数组,在那里我首先过滤跟踪器的ObjectId或它的iCAN。然后在文档中发现我需要按日过滤,所以我不会将GeoStamp列表添加到分布在多个日期的多个GeoStamp数组中。 我想可以用下面的方法来做: 我的查询(是的,我知道retrievedFields是不推荐的,我不想使用它,但这是我最接近工作的解决方案): 写入