首页 > 解决方案 > 如何在 Java Mongo 投影操作中给出 $toObjectId

问题描述

我是 mongo 的新手。下面是我在mongodbshell 中进行的聚合操作。但是在我的 java ProjectionAggregation 中,我无法给出$toObjectId. 请纠正我我错过了什么。

db shell query

 db.getCollection('UserData').aggregate([

{
 $project : {
     "username" : "$username",
     "beneficiaries" : "$beneficiaries"
        
     }   
 },
 {
    $unwind :   {
        path : "$beneficiaries",
        preserveNullAndEmptyArrays: true
    }
  },
  {
 $project : {  
     "username" : "$username",
     "beneficiaries" : "$beneficiaries",
      ---- dont know how to give $toObjectId in java ProjectionOperation .
     "beneficiaryStudId" : { $toObjectId : "$beneficiaries.studentId" }  
     }
 },
  {
      $lookup:
         {
           from: "StudentProfileData",
           localField: "beneficiaryStudId",
           foreignField: "_id",
           as: "studProfile"
          }
      }
])

Java code Projection Operation

        ProjectionOperation projectUserAndBeneficiaries = Aggregation.project()
                  .andExpression("username").as("username")
                  .andExpression("beneficiaries").as("beneficiaries");

        
        ProjectionOperation projectUserAndOtherDetails = Aggregation.project()
                  .andExpression("username").as("username")
                  .andExpression("beneficiaries").as("beneficiaries")
---- How to give $toObjectId in projection operation             .andExpression("beneficiaries.studentId").as("beneficiaryStudId");
                  
        LookupOperation lookupOperation = LookupOperation.newLookup().
                from("StudentProfileData").
                localField("beneficiaryStudId").
                foreignField("_id").
                as("studProfile");
 
        Aggregation agg = Aggregation.newAggregation(projectUserAndBeneficiaries, unwindBeneficiars,  
                projectUserAndOtherDetails
                ,lookupOperation);
        AggregationResults<UserAndStudentData> output 
          = mongotemplate.aggregate(agg, "UserData", UserAndStudentData.class);

      

样本输出

Output in db shell
{
    "_id" : ObjectId("5d2f08574de2690001c281ac"),
    "username" : "ks241@goo.com",
    "beneficiaries" : {
        "studentId" : "5d2f0e9c3bcf3e0001a7e562",
        "mcBeneficiaryId" : "597418",
        "enabled" : true
    },
    "beneficiaryStudId" : ObjectId("5d2f0e9c3bcf3e0001a7e562"),
    "studProfile" : [ 
        {
            "_id" : ObjectId("5d2f0e9c3bcf3e0001a7e562"),
            "lastName" : "Sharma",
            "firstName" : "Kapil",
            "studentRegisterCustomFieldValues" : [ 
                {
                    "bcfdValue" : "One",
                    "bcfdName" : "Year"
                } 
            ],
            "gender" : "M",
            "merchantId" : "38788943"
        }
    ]
}

java中

如果我在上面的 java 聚合投影查询中添加 $toObjectId 并运行它会产生与 db shell 相同的值,则 studProfile 数组始终为空。

标签: javamongodbaggregation-framework

解决方案


Spring 数据不支持少数类型的方法。这个问题可能包含在其中。但是我们可以使用这个解决方案。

Aggregation aggregation=newAggregation(
    p-> new Document("$project",
        new Document()
        .append("username","$username"),
        .append("beneficiaries","$beneficiaries)
        .append("beneficiaryStudId",
            new Document("$toObjectId","$beneficiaries.studentId")
        )
     )
 )

推荐阅读