【问题标题】:convert _id(ObjectId) to String in aggregation for lookup Spring boot将 _id(ObjectId) 转换为聚合中的字符串以进行查找 Spring boot
【发布时间】:2021-01-13 01:33:51
【问题描述】:

这不是问题

我在spring boot聚合中将objectId转换为字符串时遇到了很长时间的问题,我找不到任何有用的方法来解决它。 最后,我想通了,我想把我的方法分享给有同样问题的人; 如您所知,查找需要查找相同值的两侧,例如,两侧 objectId 或两侧字符串 如果您在另一侧有 objecteId 和 string,则必须将此 objectId 设置为字符串,然后编写查找阶段; 查找之前的阶段应该是使用 $toString 表达式的项目阶段,如下所示:

ProjectionOperation projectionOperation = Aggregation.project(/*your nedded fields */)
.and(ConvertOperators.ToString.toString("$_id)).as("aggId");

然后你可以像下面这样轻松地使用查找:

Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(
                        Criteria.where("cratorId").is(userId)
                )
                ,
                projectionOperation
                ,
                Aggregation.lookup("post", "aggId", "courseId", "postList"),

我的完整汇总是:

ProjectionOperation projectionOperation = Aggregation.project(/*your nedded fields */)
.and(ConvertOperators.ToString.toString("$_id")).as("aggId");

Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(
                        Criteria.where("creatorId").is(userId)
                )
                ,
                projectionOperation
                ,
                Aggregation.lookup("post", "aggId", "courseId", "postList")
);

return this.aggregate(agg, entityClass, Object.class).getMappedResults();

希望对你有用

【问题讨论】:

    标签: java mongodb spring-boot mongodb-query mongotemplate


    【解决方案1】:
    List<Map> getMultiTable(){
        ProjectionOperation projectionOperation = Aggregation.project(/*your nedded fields */)
                .and(ConvertOperators.ToString.toString("$_id")).as("_id")
                .and(ConvertOperators.ToObjectId.toObjectId("$userId")).as("userId");
    
        Aggregation agg = Aggregation.newAggregation(
                Aggregation.match(
                        Criteria.where("status").is(0)
                ),
                projectionOperation,
                Aggregation.lookup("videoComment", "_id", "videoId", "commentList"),
                Aggregation.lookup("user", "userId", "_id", "userList")
        );
    
        List<Map> result = mongoTemplate.aggregate(agg, "mediaFile", Map.class).getMappedResults();
        System.out.println(result);
        return result;
    }
    

    【讨论】:

    • 三张表,针对不同风格的字段有两种不同的转换器: 1. objectId to string ; 2.ToObjectId.toObjectId
    【解决方案2】:

    我也在寻找这个问题的答案,我找到了这个解决方案。

    我正在使用spring-data-mongodb:3.0.0.RELESE

    在您的聚合管道中

    AddFieldsOperation.builder().addField("strId")
                        .withValue(
                            ConvertOperators.ToString.toString("$_id")
                        ).build()
    

    这相当于

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

    您可以将strId 替换为您想要的任何名称,并在接下来的操作中使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-25
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 2020-09-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多