用于聚合 $map 的 SpringData mongoDB API [英] SpringData mongoDB API for Aggregation $map

查看:38
本文介绍了用于聚合 $map 的 SpringData mongoDB API的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下是我的本机 MongoDB 查询,以下是 SpringData Mongo API 等效项.我对在 SpringData Mongo API 中的 $project 中使用 $map 感到震惊.感谢您帮助我完成 API 转换

Following is my Native MongoDB query and below is the SpringData Mongo API equivalent. I am getting struck on using $map in $project in SpringData Mongo API. Appreciate your help on completing my conversion to API

db.users.aggregate([    
    { $match: {$and : [{userType:"200"} },    
     { $unwind: "$userOrgMap" },
    {
      $lookup:
        {
          from: "users",
          localField: "userOrgMap.createdbyuser",
          foreignField: "_id",
          as: "created_by"
        }
   },
   {$project:{
       _id:"$_id",
       login:"$login",
       firstName:"$firstName",
       lastName:"$lastName",
       email:"$email",
       deactivateFlag:"$deactivateFlag",
       createdOn:"$createdOn",
       createdBy:{
        "$map": { 
                    "input": "$created_by", 
                    "as": "u", 
                      "in": { 
                          "name": { "$concat" : [ "$$u.firstName", " ", "$$u.lastName" ] }, 
                      } 
                }
    }
      }
    },
    { $sort : { createdBy : 1} }

])

Spring 查询

 Aggregation aggregation = newAggregation(
            Aggregation.match(Criteria.where("userType").is(userType)),
            Aggregation.unwind("userOrgMap"),
            Aggregation.lookup("users", "userOrgMap.createdbyuser", "_id", "created_by"),
            Aggregation.project("userId","login","firstName","lastName","email","deactivateFlag","createdOn")
        );

推荐答案

你可以试试下面的$map聚合.

You can try below $map aggregation.

  project().and(mapItemsOf("created_by").
                            as("u").
                            andApply(new AggregationExpression() {
                                @Override
                                public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) {
                                    return new BasicDBObject("name", StringOperators.valueOf("u.firstName").concat(" ").concatValueOf("u.lastName").toDbObject(aggregationOperationContext));
                                }
                            }))
             .as("createdBy");

使用$let 表达式

 project().and(VariableOperators.Let.define(VariableOperators.Let.ExpressionVariable.newVariable("u").forExpression(ArrayOperators.arrayOf("created_by").elementAt(0))).
                            andApply(new AggregationExpression() {
                                @Override
                                public DBObject toDbObject(AggregationOperationContext aggregationOperationContext) {
                                    return new BasicDBObject("name", StringOperators.valueOf("u.firstName").concat(" ").concatValueOf("u.lastName").toDbObject(aggregationOperationContext));
                                }
                            }))
            .as("createdBy");

使用 lambda 和静态导入.

Use lambda and static imports.

import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.arrayOf;
import static org.springframework.data.mongodb.core.aggregation.StringOperators.valueOf;
import static org.springframework.data.mongodb.core.aggregation.VariableOperators.Let.ExpressionVariable.*;
import static org.springframework.data.mongodb.core.aggregation.VariableOperators.Let.define;
import static org.springframework.data.mongodb.core.aggregation.VariableOperators.mapItemsOf;

project().and(mapItemsOf("created_by").
                as("u").
                andApply(aggregationOperationContext -> new BasicDBObject("name", valueOf("u.firstName").concat(" ").concatValueOf("u.lastName").toDbObject(aggregationOperationContext))))
                .as("createdBy");

    project().and(define(newVariable("u").forExpression(arrayOf("created_by").elementAt(0))).
            andApply(aggregationOperationContext -> new BasicDBObject("name", valueOf("u.firstName").concat(" ").concatValueOf("u.lastName").toDbObject(aggregationOperationContext))))
            .as("createdBy");

这篇关于用于聚合 $map 的 SpringData mongoDB API的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆