Spring 数据 MongoDB 复杂对象的 addToSet()

Spring Data MongoDB addToSet() with complex object

我想使用 Spring 数据通过 Java 应用程序从 MongoDB 获取数据。

我按照 MongoDB 查询并成功转换为 Java 代码

db.getCollection('financialMessage').aggregate([{
            $match:{ createdDate: {
                       $gte: ISODate("2017-11-03 00:00:00.000Z"), 
                       $lt: ISODate("2017-11-04 00:00:00") }}}, { 
            $group: { _id: {
                        consolidatedBatchId: "$consolidatedBatchId",
                        version: "$version"},
                      messages: { $addToSet: "$message" }}}, {
            $sort: {
                    "_id.consolidatedBatchId": 1,
                    "_id.version": 1}
            }])

结果如下:

{
    "_id" : {
        "consolidatedBatchId" : "5f4e1d16-2070-48ef-8369-00004ec3e8ee",
        "version" : 4
    },
    "messages" : [ 
        "message1", 
        "message2", 
        "message3"
    ]
}

Java 上述查询的代码如下:

        Criteria filterCriteria = Criteria.where(CREATED_DATE)
            .gte(startDate)
            .lt(endDate);
        Sort sort = new Sort(Sort.Direction.DESC, "consolidatedBatchId" ,"version");

        Aggregation agg = Aggregation.newAggregation(
            Aggregation.match(filterCriteria),
            Aggregation.group("consolidatedBatchId", "version")
                .addToSet("message").as("messages"),
            Aggregation.sort(sort)
        );

        AggregationResults<FinancialMessageKey> aggregationResults =
            mongoTemplate.aggregate(agg, FinancialMessage.class, FinancialMessageKey.class);

        return aggregationResults.getMappedResults();

现在我找不到如何将以下 MongoDB 查询代码转换为 Java 代码:

db.getCollection('financialMessage').aggregate([{
        $match:{ createdDate: {
                            $gte: ISODate("2017-11-03 00:00:00.000Z"), 
            $lt: ISODate("2017-11-04 00:00:00")
                }}}, { 
        $group: { _id: {
            consolidatedBatchId: "$consolidatedBatchId",
            version: "$version"},
                            messages: { $addToSet: {message: "$message",
                                             createdDate: "$createdDate",
                                             sender: "$sender",
                                             receiver: "$receiver" }}}}, {
        $sort: {
                "_id.consolidatedBatchId": 1,
                "_id.version": 1}
        }])

具有以下输出:

{
    "_id" : {
        "consolidatedBatchId" : "5f4e1d16-2070-48ef-8369-00004ec3e8ee",
        "version" : 4
    },
    "messages" : [ 
        {
            "message" : "message1",
            "createdDate" : ISODate("2017-11-03T07:13:08.074Z"),
            "sender" : "sender",
            "receiver" : "receiver"
        }, 
        {
            "message" : "message2",
            "createdDate" : ISODate("2017-11-03T07:13:08.111Z"),
            "sender" : "sender",
            "receiver" : "receiver"
        }, 
        {
            "message" : "message3",
            "createdDate" : ISODate("2017-11-03T07:13:07.986Z"),
            "sender" : "sender",
            "receiver" : "receiver"
        }
    ]
}

如何在 Java 中写入此 addToSet() 以获得 List<'complex object'> 而不是简单的 List?

在 Google 上研究了几分钟后,我终于找到了怎么做。

public List<FinancialMessageKey> findFinancialMessageKeys(FinancialMessageQueryDTO financialMessageQueryDTO) {

        Criteria filterCriteria = Criteria.where(CREATED_DATE)
            .gte(startDate)
            .lt(endDate);
        Sort sort = new Sort(Sort.Direction.DESC, "consolidatedBatchId", "version");

        Aggregation agg = Aggregation.newAggregation(
            Aggregation.match(filterCriteria),
            Aggregation.group(CONSOLIDATED_BATCH_ID, VERSION)
                .addToSet(new BasicDBObject() {
                              {
                                  put(CREATED_DATE, "$" + CREATED_DATE);
                                  put(SENDER, "$" + SENDER);
                                  put(RECEIVER, "$" + RECEIVER);
                                  put(MESSAGE, "$" + MESSAGE);
                              }
                          }
                ).as("messages"),
            Aggregation.sort(sort));

        AggregationResults<FinancialMessageKey> aggregationResults =
            mongoTemplate.aggregate(agg, FinancialMessage.class, FinancialMessageKey.class);

        return aggregationResults.getMappedResults();
    }