java mongoTemplate 操作 Aggregation 中添加 addFields

T ? weblog 你我凑二而成三,我独自一人永不及 本文由博客端 https://www.runnable.run 主动推送

mongoTemplate 操作 mongodb 真是各种坑,springboot 官方文档上给到的案例不满足实际的需求

场景复现

现在有条 mongodb 的 sql 是这样的,文档 wallpaper 的 _id 关联文档 wallpaper_get_success 的 wallpaper_id 进行查询。

db.wallpaper.aggregate([
    {
        $addFields: {
            "_id": {
                "$toString": "$_id"
            }
        }
    },
    {
      "$lookup": {
        "from": "wallpaper_get_success",
        "localField": "_id",
        "foreignField": "wallpaper_id",
        "as": "success_id"
      }
    },
    {
      "$match": {
        "success_id": {
          "$ne": []
        }
      }
    },
    {
      "$sample": {
        "size": 5
      }
    }
])

然后呢,下面这一节是必不可少的,因为有这个问题: mongodb 连接查询,localField 使用_id 进行匹配不生效

{
        $addFields: {
            "_id": {
                "$toString": "$_id"
            }
        }
    }

但是数据库操作很 sql,转换成 Java 代码就日狗了,newAggregation 中 lookup,match,sample 操作都可以,但是 addFields 操作不行

Aggregation aggregation = newAggregation(
                Aggregation.fields(""), //这一截是有问题的
                lookup("wallpaper_get_success", "_id", "wallpaper_id", "success_id"),
                match(Criteria.where("success_id").ne(new WallpaperGetSuccess[]{})),
                sample(5)
        );

image.png

网上对于这个的操作几乎没有,后来还是在 stackoverflow 找到的

解决办法

原文:How can I implement addFields mongoDB query in Java

其实也就是,addFields 改成 new Document

关键点: 引入的 Document 类是,而不是 spring-boot-data-mongo 中的

import org.bson.Document;

代码如下

import org.bson.Document;//关键的引入
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.aggregation.*;
import static org.springframework.data.mongodb.core.aggregation.Aggregation.*;
import org.springframework.data.mongodb.core.query.Collation;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.stereotype.Component;

Aggregation aggregation = newAggregation(
                aoc -> new Document("$addFields",new Document("_id",new Document("$toString","$_id"))),
                lookup("wallpaper_get_success", "_id", "wallpaper_id", "success_id"),
                match(Criteria.where("success_id").ne(new WallpaperGetSuccess[]{})),
                sample(5)
        );

当然你也可以不使用 lambda 表达式,如下

image.png

这里比较一下原生 sql 和 java 代码

image.png

  • MongoDB

    MongoDB(来自于英文单词“Humongous”,中文含义为“庞大”)是一个基于分布式文件存储的数据库,由 C++ 语言编写。旨在为应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似 JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。

    83 引用 • 58 回帖 • 3 关注

广告 我要投放

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...