【问题标题】:query to return single field from spring data mongo查询以从 Spring Data mongo 返回单个字段
【发布时间】:2019-05-13 17:05:26
【问题描述】:

我的应用程序中有多个数据源(mysql 和 mongodb),我分别使用 JpaRepository(spring data jpa)和 MongoRepository(spring data mongo)。

以下代码用于从车辆表(mysql)中获取所有imei号码

@Repository
public interface VehicleRepo extends JpaRepository<Vehicle, Long>{
    @Query(value = "SELECT imei FROM vehicle", nativeQuery = true)
    public List<Object[]> findImei();
}

我有另一个像下面这样的 mongo repo。

@Repository
public interface DeviceRepo extends MongoRepository<Device, String>{
    // looking for a method which returns all the distinct imei
}

我想知道 mongodb 中的查询是什么。

(我的要求是从设备中选择所有唯一不同的imei字段,并且只选择像VehicleRepo这样的单个字段)

我尝试了多种组合,但都没有奏效。

【问题讨论】:

  • 有些人认为@Query("{'yourdbfieldname':?0}") List findDistinctImei(String imei); ?
  • 如果你看到 SELECT imei FROM vehicle 我没有通过任何东西......所以我的要求也是一样的......我想获得所有不同的 imei。
  • 你可以使用类似@Query(value = "SELECT imei FROM vehicle", fileds:"{'fieldName':1}")

标签: mysql mongodb spring-boot spring-data-jpa spring-data-mongodb


【解决方案1】:

可能有点晚了,但我正在做同样的事情: 如果您的集合中只有一个字符串(数据类型)字段,并且您只想获取此字段,您可以尝试:

    @Query(value = "{ 'groupId' :  ?0 }", fields = "{ '_id': 0, 'user.$id':1 }")
    List<String> findAllUserIdByGroupId(String groupId);

值意味着查询和字段类型是你想要得到/忽略的

在 mongo db 中,您可以查看此站点 (https://docs.mongodb.com/manual/tutorial/project-fields-from-query-results/)

或 Stackoverflow 中的答案 (Spring Data Mongo Query Field parameters)

【讨论】:

    【解决方案2】:

    您还可以在自定义存储库方法中使用mongoTemplate 来实现上述相同的事情(类似于 Alien 的)响应:

     List<String> imeiList = mongoTemplate.query(Device.class)
    .distinct("imei")
    .as(String.class)
    .all();
    

    最新 spring-data-mongo 文档中的更多信息:https://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo-template.query.distinct

    【讨论】:

      【解决方案3】:

      我找不到任何使用 @Query 的解决方案,所以我不得不使用 MongoTemplate 来实现。

      DistinctIterable<String> iterableObject= mongoTemplate.getCollection("collectionName").distinct("fieldName",String.class);
      Iterator<String> iter = iterableObject.iterator();      
      while(iter.hasNext()){
          System.out.println(iter.next());
      }
      

      【讨论】:

        猜你喜欢
        • 2019-07-23
        • 2013-05-20
        • 1970-01-01
        • 2016-09-01
        • 1970-01-01
        • 2020-05-21
        • 2022-01-17
        • 2016-07-11
        • 1970-01-01
        相关资源
        最近更新 更多