java - 无法将聚合查询从 mongodb 转换为 Spring Data MongoDb

标签 java spring mongodb spring-boot spring-data

我在尝试使用聚合对象将 mongodb 中的查询转换为 Spring Data MongoDb 时遇到了麻烦。我在 mongo 中有以下文档:

{
"_id" : ObjectId("596ce468798b61179c6442bb"),
"_class" : "com.test.model.User",
"name" : "Oi",
"surName" : "Alo",
"workLogs" : [
    {
        "_id" : ObjectId("596ce468798b61179c6442bc"),
        "day" : 1,
        "month" : 1,
        "year" : 2017,
        "timeEntrance" : "8:00",
        "lunchLeave" : "12:00",
        "lunchBack" : "13:00",
        "timeLeave" : "18:00"
    },
    {
        "_id" : ObjectId("596ce468798b61179c6442bd"),
        "day" : 2,
        "month" : 1,
        "year" : 2017,
        "timeEntrance" : "8:00",
        "lunchLeave" : "12:00",
        "lunchBack" : "13:00",
        "timeLeave" : "18:00"
    }
  ]
}

我想查询同一年同月的所有工作日志,之后我只想得到工作日志数组作为结果。我设法使用以下查询使用 mongo 来完成此操作:

db.user.aggregate([
  {$unwind: '$workLogs'}, 
  {$match: {'workLogs.month':2, 'workLogs.year':2017}}, 
  {$group: {_id:'$_id', workLogs:{$push: '$workLogs'}}}, 
  {$project: {'_id':0, 'workLogs': 1}}
]).pretty()

但是我找不到如何将此查询转换为 Spring Data MongoDb,我想我已经差不多完成了,如果有人可以帮助我,我将不胜感激。这是我在 java 中使用的代码。

Aggregation agg = Aggregation.newAggregation(
  unwind("workLogs"),
  match(Criteria
    .where("_id").is(userId)
    .and("workLogs.month").is(1)
    .and("workLogs.year").is(2017)
    ),
    group("_id"),
    group("horarios")
      .push(new BasicDBObject("workLogs", "workLogs")).as("workLogs"),
    project("workLogs")
);

AggregationResults<WorkLog> results = mongoTemplate.aggregate(agg, "workLogs", WorkLog.class);

先谢谢大家了!

最佳答案

不知道为什么你的java代码中有所有额外的字段。

shell查询的java等效代码是

 Aggregation agg = Aggregation.newAggregation(
   unwind("workLogs"),
   match(Criteria
      .where("workLogs.month").is(1)
      .and("workLogs.year").is(2017)
   ),
   group("_id").push("workLogs").as("workLogs"),
   project("workLogs").andExclude("_id")
 );

或者,您可以简化代码以使用 $filter

import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project;
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter;
import static org.springframework.data.mongodb.core.aggregation.BooleanOperators.And.and;
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq;

 Aggregation agg = newAggregation(project().
     and(
      filter("workLogs").
      as("workLog").
      by(
       and(
          Eq.valueOf("workLog.month").equalToValue(1), 
          Eq.valueOf("workLog.year").equalToValue(2017)
      )
     )
    ).as("workLogs").
    andExclude("_id")
 );

关于java - 无法将聚合查询从 mongodb 转换为 Spring Data MongoDb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45438858/

相关文章:

java - RabbitMQ:如何在 "subscription added"上创建监听器

node.js - 使用nodejs处理mongoDB的问题(使用express和handlebars)

MongoDB数据库架构

Java:在目录之间复制文件

java - 如何在 Spring 应用程序的 web.xml 中正确映射内容?

java - 用于下载 Java JDK Windows 的 Python 脚本

java - if 语句无法过滤空名称

spring - 如何在 Spring 中将 @Cacheable 与方法返回类型 Stream<Object> 一起使用?

java - 如何将 HTTPServletResponse 转换为 HttpEntity?

c# - 为所有继承自基类型的类设置自定义 MongoDB BsonSerializer