创建聚合管道时 AccumulatorOperators Max 的问题

时间:2020-12-23 13:24:09

标签: java mongodb spring-data spring-data-mongodb spring-mongodb

我正在尝试将以下 Mongo shell 聚合查询转换为 Spring Data MongoDB 聚合:

db.getCollection('Orders').aggregate([
{ $group: {
    "_id": {"book":"$bookingId"},
    "docs": {$push: '$$ROOT'}
  }
},
{$project: {
   latestOrd: {
      $filter: {
         input: "$docs",
         as: "item",
         cond: { $eq: ["$$item.bookingVersion", { $max: "$docs.bookingVersion" }] }
      }
   }
 }
},
{ $unwind: "$latestOrd" },
{ $replaceRoot:{newRoot:"$latestOrd"}}
])

查询获取所有预订版本最高的订单(例如,一个bookingId可能有多个版本3的文档)。

此查询在 Mongo shell 中工作正常,但我对它的 Spring Data 版本有问题:

Aggregation.group("bookingId").push(Aggregation.ROOT).as("docs");
Aggregation.project().and(filter("docs")
          .as("item")
          .by(valueOf("item.bookingVersion")
                .equalToValue(AccumulatorOperators.Max.maxOf("docs.bookingVersion"))))
          .as("latestOrd");
Aggregation.unwind("latestOrd");
Aggregation.replaceRoot("latestOrd");

Spring 生成的 Mongo 查询类似于我在上面提供的查询,除了 $max accumulator:

{ "$max" : "$$docs.bookingVersion" }

出于某种原因,它添加了双美元符号而不是单美元符号,因此我出现以下错误:

'Use of undefined variable: docs' on server 127.0.0.1:27017

我使用的是 spring-boot-starter 2.1.0.RELEASE 和 4.2 版本的 Mongo 服务器。 感谢您对此的任何帮助。

输入文件:

[
  {
    "_id": "5f847811ebcd1a51a0196736",
    "status": "REJECTED",
    "bookingId": "1",
    "bookingVersion": 4,
    "operation": "CREATE"
  },
  {
    "_id": "5f847811ebcd1a51a0196735",
    "status": "CREATED",
    "bookingId": "1",
    "bookingVersion": 4,
    "docNumber": "7",
    "operation": "CREATE"
  },
  {
    "_id": "5f847811ebcd1a51a0196734",
    "status": "CREATED",
    "bookingId": "1",
    "bookingVersion": 3,
    "docNumber": "6",
    "operation": "CREATE"
  },
  {
    "_id": "5f847811ebcd1a51a0196738",
    "status": "CREATED",
    "bookingId": "2",
    "bookingVersion": 1,
    "docNumber": "8",
    "operation": "CREATE"
  },
  {
    "_id": "5f847811ebcd1a51a0196737",
    "status": "CREATED",
    "bookingId": "2",
    "bookingVersion": 2,
    "docNumber": "9",
    "operation": "CREATE"
  }
]

预期输出:

[
  {
    "_id": "5f847811ebcd1a51a0196736",
    "status": "REJECTED",
    "bookingId": "1",
    "bookingVersion": 4,
    "operation": "CREATE"
  },
  {
    "_id": "5f847811ebcd1a51a0196735",
    "status": "CREATED",
    "bookingId": "1",
    "bookingVersion": 4,
    "docNumber": "7",
    "operation": "CREATE"
  },
  {
    "_id": "5f847811ebcd1a51a0196737",
    "status": "CREATED",
    "bookingId": "2",
    "bookingVersion": 2,
    "docNumber": "9",
    "operation": "CREATE"
  }
]

0 个答案:

没有答案