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

关于springdata mongodb聚合

佘茂才
2023-03-14

目前,我有个问题。我可以在mongodb中使用聚合函数查询相应的数据,但是在使用springdatamongodb后,我发现lookup不能使用变量将string转换为objectid,那么该如何编写这个聚合函数呢

如何在spring data mogodb中将其写成mongodb表达式

  db.getCollection('course').aggregate([{
            $unwind: '$studentIds',
          },
          {
            $lookup: {
              from: 'student',
              let: { stuId: { $toObjectId: '$studentIds' } },
              pipeline: [
                {
                  $match: {
                    $expr: { $eq: [ '$_id', '$$stuId' ] },
                  },
                },
                {
                  $project: {
                    isSendTemplate: 1,
                    openId: 1,
                    stu_name: '$name',
                    stu_id: '$_id',
                  },
                },
              ],
              as: 'student',
            },
          }])

共有1个答案

曹焱
2023-03-14

对于复杂的自定义聚合查询,您可以创建一个自定义的AggregationOperation,然后从Mongo shell传递聚合json,或者您所拥有的内容。例如:

import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperationContext;

public class CustomAggregationOperation implements AggregationOperation {

  private String jsonOperation;

  public CustomAggregationOperation(String jsonOperation) {
    this.jsonOperation = jsonOperation;
  }

  @Override
  public org.bson.Document toDocument(AggregationOperationContext aggregationOperationContext) {
    return aggregationOperationContext.getMappedObject(org.bson.Document.parse(jsonOperation));
  }
}

现在,将$lookup查询像在上面的类中一样从聚合查询类中传递,如下所示:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.TypedAggregation;
import org.springframework.stereotype.Service;
import sample.data.mongo.models.Course;

@Service
public class LookupAggregation {

  @Autowired
  MongoTemplate mongoTemplate;

  public void LookupAggregationExample() {

    AggregationOperation unwind = Aggregation.unwind("studentIds");

    String query1 = "{$lookup: {from: 'student', let: { stuId: { $toObjectId: '$studentIds' } },"
        + "pipeline: [{$match: {$expr: { $eq: [ '$_id', '$$stuId' ] },},}, "
        + "{$project: {isSendTemplate: 1,openId: 1,stu_name: '$name',stu_id: '$_id',},},], "
        + "as: 'student',}, }";

    TypedAggregation<Course> aggregation = Aggregation.newAggregation(
        Course.class,
        unwind,
        new CustomAggregationOperation(query1)
    );

    AggregationResults<Course> results =
        mongoTemplate.aggregate(aggregation, Course.class);
    System.out.println(results.getMappedResults());
  }
}

有关更多细节,您可以查看我的Github repo:https://Github.com/krishnaiitd/learningjava/blob/master/spring-boot-sample-data-mongoDB/src/main/java/sample/data/mongo/services/lookupaggregation.java

 类似资料:
  • 我试图确认我对关联、聚合的代码外观的理解 聚合:哈斯-a。它具有另一种类型的现有对象 组成:由另一个对象组成 协会:我对此有两种看法。 > 当一个类与另一个类相关联时。因此,上述两个都是关联的示例。 关联是一种较弱的聚合形式,其中类不保留对其接收的对象的引用。 我的理解正确吗?我在这里和这里阅读了相互矛盾的文章,所以我真的不确定该遵循哪一个。我的理解似乎符合第一个环节。我觉得第二个环节是错误的,或

  • 问题内容: 我试图了解ElasticSearch中过滤器聚合的语法,但很困惑。文档中给出的示例是这样的: 我了解以下内容: “ aggs”定义了聚合块(这是“聚合”的快捷方式)。可以看到,示例中实际上存在嵌套的聚合。 “消息”是聚合块的用户定义名称。 “错误”和“警告”是用于创建聚合“桶”的过滤器的用户定义名称。他们删除“正文”分别等于“错误”和“警告”(匹配“术语”)的项目。 我不明白的是为什么

  • 本文向大家介绍SpringDataMongoDB多文档事务的实现,包括了SpringDataMongoDB多文档事务的实现的使用技巧和注意事项,需要的朋友参考一下 一、安装MongoDB4.0.3(××) 1.1、官方安装文档 https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/ 1.2、tar.gz包下载地址 h

  • 我有以下代码: 在Bouml中,我从这段代码中生成了类图: 图表 我认为 A 和 F 之间的 (https://softwareengineering.stackexchange.com/questions/255973/c-association-aggregation-and-composition) 关系必须产生聚合关系,但它产生了关联关系。如何建立聚合关系?

  • 我理解聚合和组合之间的区别,但我在联想方面有点挣扎。我目前的理解是,当“它们相互使用”时,类之间存在关联,例如,在方法调用期间将一个对象传递给另一个对象。另请参阅: http://www.codeproject.com/Articles/330447/Understanding-Association-Aggregation-and-Composit 这两个对象都是独立存在的,和聚合不同,任何对象

  • 我开始研究 OOAD,我很难找到一个 代码示例来说明如何以编程方式实现、和。(到处都有几篇文章,但它们与 C# 或 Java 有关)。我确实找到了一两个例子,但它们都与我的导师的指示相冲突,我很困惑。 我的理解是,在: < li >关联:Foo有一个指向Bar对象的指针作为数据成员 < li >聚合:Foo有一个指向Bar对象的指针,Bar的数据被深度复制到该指针中。 < li >组成:Foo有一