【问题标题】:Using $eq in aggregate project Spring Data equivalent在聚合项目 Spring Data 等效项中使用 $eq
【发布时间】:2017-06-02 09:34:23
【问题描述】:

以下是我的 MongoDB 查询

{$project:{
       firstName: "$firstName",
       lastName:"$lastName",
       email:"$email",
       company :"$organization.name",
       RoleName :"$organization.roles.roleName",
       matchingRole: { $eq: [ "$organization.roles.orgRoleId","$userOrgMap.roleId" ] }
      }
    },
    { $match: {matchingRole:true},{ $sort : { firstName : 1} }])

以下是我的 SpringData mongo API

aggregation = newAggregation(
                project("firstName", "lastName", "email")
                        .and("organization.name").as("company")
                        .and("organization.roles.roleName").as("roleName")

我想知道如何使用 Spring API 在项目聚合中使用 $eq。我试图将匹配项放在项目之外,如下所示。但是查询没有获取任何记录。所以我使用 $eq 在项目中进行比较,并将结果分配到一个新的项目属性中,并在项目管道之外检查它。

{ $match: {$organization.roles.orgRoleId","$userOrgMap.roleId"}

【问题讨论】:

  • 我想出了以下等效项目(“_id”、“login”、“firstName”、“lastName”、“email”、“deactivateFlag”、“lastActivity”).and(" organization.name").as("company") .and("organization.roles.roleName").as("roleName") .and(when(where("organization.roles.orgRoleId").is("userOrgMap .roleId")).then(true).otherwise(false)).as("matchingRoleIds"), match(Criteria.where("matchingRoleIds").is(true)),
  • 需要测试这个API

标签: aggregation-framework spring-data-mongodb


【解决方案1】:

您可以在$project 阶段通过以下方式使用$eq 聚合。

and(ComparisonOperators.Eq.valueOf("organization.roles.orgRoleId").equalTo("us‌​erOrgMap.roleId")).as("matchingRole"),

【讨论】:

  • 它给了我以下错误线程“主”org.springframework.data.mapping.context.InvalidPersistentPropertyPath 中的异常:在 > 上找不到属性角色。
  • 以下对我有用.and(when(where("organization.roles.orgRoleId").is("userOrgMap.roleId")).then(true).otherwise(false))。 as("matchingRoleIds")
  • 您不必使用AggregationExpression 将值投影为falsetrue。仅当操作符未包含在 api 中时才应使用该钩子。使用返回布尔值的 api helper $eq。修复您的 d 以包含角色属性。
  • 我面临另一个问题。 MongoDB 查询工作正常matchingRole: { $eq:[ "$organization.roles.orgRoleId","$userOrgMap.roleId" ] } } }, { $match: {matchingRole:true}, 但我遇到以下问题时我在 java.util.ArrayList.get(ArrayList.get(ArrayList. java:429) 在 java.util.Collections$UnmodifiableList.get(Collections.java:1309)
  • 我面临另一个问题。 MongoDB 查询工作正常matchingRole: { $eq:[ "$organization.roles.orgRoleId","$userOrgMap.roleId" ] } } }, { $match: {matchingRole:true}, 但我遇到以下问题时我在 java.util.ArrayList.get(ArrayList.get(ArrayList. java:429) at java.util.Collections$UnmodifiableList.get(Collections.java:1309) 这是因为在别名 isMatchRoles 上使用了匹配条件。
猜你喜欢
  • 1970-01-01
  • 2020-02-20
  • 2015-12-23
  • 2012-05-25
  • 1970-01-01
  • 1970-01-01
  • 2019-04-12
  • 2017-11-07
  • 2016-11-21
相关资源
最近更新 更多