如何在查询JavaSpringMongo存储库中返回特定字段的列表?

mkh04yzy  于 2021-07-15  发布在  Java
关注(0)|答案(4)|浏览(371)

我在项目中使用JavaSpring和mongodb存储库。
定义如下:

@Document(collection = "Info")
public class Info  {

  String id,
  Integer count,
  String type
  …
}

我需要从查询中返回一个id列表,其中count字段不是零,type字段有“binary”文本。
下面是我如何实现它:

@Query(value="{ 'count' : 0, 'type' : 'binary' }", fields="{ 'id' : 1 }")
List<String> getInfo();

我从上面的查询中得到这个结果:

0={"_id": {"$oid": "5eb97a8139d4c62be4d90e4c"}}
1={"_id": {"$oid": "3ec97a8127d4c60cb4d90e9e"}}

我期待这个结果:

{"5eb97a8139d4c62be4d90e4c", "3ec97a8127d4c60cb4d90e9e"}

如您所见,我希望从上面的查询中获得一个id字符串列表。
你知道我应该在上面的查询中修改什么才能得到预期的ids结果列表吗?

tnkciper

tnkciper1#

不,你想的不可能。
原因:mongodb只能返回json文档。你可以包括你想要的字段。
您可以遵循以下建议:
dto定义:

@Document(collection = "Info")
public class Info  {

  @Id
  private String id;

  private Integer count;

  private String type;

  // other fields and getters and setters
}

示例存储库:

public interface InfoRepository extends MongoRepository<Info, String> {

   @Query(value="{ 'count' : 0, 'type' : 'binary' }", fields="{ 'id' : 1 }")
   List<Info> getInfo();

}

服务类别示例:

@Service
public class InfoService {

   @Autowired 
   private InfoRepository infoRepository;

   public List<String> getIds() {

      return infoRepository.getInfo()
                      .stream()
                      .map(Info::getId)
                      .collect(Collectors.toList());    

   }

}
6pp0gazn

6pp0gazn2#

他回来了 {"$oid": "5eb97a8139d4c62be4d90e4c"} 是objectid的mongodb扩展json表示。
它不返回字符串,因为数据库中存储的字段的类型为 ObjectID ,不是类型 String .
如果您希望它返回一个字符串,您应该使用聚合和$tostring操作符来转换它。

kzipqqlq

kzipqqlq3#

您能得到的最好结果是一个带有数组字段的文档,其中包含找到的ID,如下所示:

{
    "ids" : [
        "606018909fb6351e4c34f964",
        "606018909fb6351e4c34f965"
    ]
}

这可以通过如下聚合查询实现:

db.Info.aggregate([
    {
        $match: {
            count: 0,
            type: "binary"
        }
    },
    {
        $project: { _id: { $toString: "$_id" } }
    },
    {
        $group: {
            _id: null,
            ids: { $push: "$_id" }
        }
    },
    {
        $project: { _id: 0 }
    }
])
polkgigr

polkgigr4#

我有两个建议。
1.您可以使用jpa查询而不是命名查询

public interface InfoRepository extends MongoRepository<Info, String> {
         List<Info> findByCountAndType(final Integer count, final String type);
    }

2.在业务逻辑中使用javastreamapi从上述结果中收集所有id作为列表。

public class InfoServiceImpl {
       @Autowired
       private InfoRepository repository;

       public String getIds(final String type, final Integer count) {
           return repository.findByCountAndType(count, type)
                  .stream()
                  .map(Info::getId)
                  .collect(Collectors.toList());
       }

相关问题