Spring MongoDB 在结果中只获取值而不是 key:value

Posted

技术标签:

【中文标题】Spring MongoDB 在结果中只获取值而不是 key:value【英文标题】:Spring MongoDB getting only values instead of key:value in result 【发布时间】:2022-01-14 12:33:03 【问题描述】:

你好,所以我想从 mongoDB 获取 ID 列表,编写了返回 id:value 映射的代码,我只是希望它只返回值。

        query=new Query(Criteria.where("_id").is("47b3b1ab-2d80-42cf-b289-e3d45497b59f"));
        query.fields().include("recordList.id").exclude("_id");
        System.out.println( mongoTemplate.findOne(query, Map.class,"Company3"));
recordList=[id=rec4vCGPy3EnXRuCM, id=recAivYlqtDzZP62C, id=recbcLfxuLLB6Jjn0, id=reckIA8RdQtDUKCYI, id=rectnZZzBJ2iKN8eO]

但我需要这样的东西

[rec4vCGPy3EnXRuCM, recAivYlqtDzZP62C, recbcLfxuLLB6Jjn0, reckIA8RdQtDUKCYI, rectnZZzBJ2iKN8eO]

是的,我知道我可以像这样操纵结果以获得所需的结果,但我想知道是否可以直接从 DB 获得相同的结果,而不是像这样

        List<Map<String,String>> list = (List<Map<String, String>>) mongoTemplate.findOne(query, Map.class,"Company3").get("recordList");

        List<String> idList=new ArrayList<>();
        for (Map<String, String> stringStringMap : list) 
            idList.add(stringStringMap.get("id"));
        

这就是我的数据的样子 mongodb document。抱歉插入图片,如果不可读就无法复制。

【问题讨论】:

【参考方案1】:

你不能使用 Mongodb 做到这一点。这个数据库是面向文档的,这意味着给定一个标准(在本例中是一个 id),您将获得一个满足标准的文档列表,其中每个文档都有一些属性和一些值。

为了更简单,您可以重写代码,以便将结果映射到仅包含您想要的 id 列表且没有键的 pojo。

类似于以下内容:

public class Result 

private List<String> ids;

// getters and setters here

@override
public String toString()
    return ids.toString();



现在您检索数据的存储库方法将如下所示:

query = new Query(Criteria.where("_id").is("47b3b1ab-2d80-42cf-b289-e3d45497b59f"));

// 不需要这个 //query.fields().include("recordList.id").exclude("_id");

System.out.println(mongoTemplate.findOne(query, Result.class,"Company3"));

【讨论】:

这个帖子的解决方案回答了你的帖子,谢谢! 太好了,我学到了一些新东西:)。没问题!【参考方案2】:

也许 distinct 会有所帮助。 https://docs.mongodb.com/manual/reference/method/db.collection.distinct/

Query query=new Query(Criteria.where("_id").is("adfe377d-6e5b-48f0-b5bb-12b09f57285d"));

System.out.println(mongoTemplate.findDistinct(query,"recordList.id","Company4",String.class));

【讨论】:

@NikolozLatsabidze - 将更新答案!很高兴我能够以某种方式提供帮助。 您的回答肯定帮了大忙,找不到单一的解决方案。谢谢。【参考方案3】:

oblivion02 的解决方案有点错误,但绝对暗示了我正确的方向,谢谢。

Query query=new Query(Criteria.where("_id").is("adfe377d-6e5b-48f0-b5bb-12b09f57285d"));
System.out.println(mongoTemplate.findDistinct(query,"recordList.id","Company4",String.class));

仅这两行就为我提供了一个非常干净的 id 值列表

[rec4vCGPy3EnXRuCM, recAivYlqtDzZP62C, recbcLfxuLLB6Jjn0, reckIA8RdQtDUKCYI]

【讨论】:

以上是关于Spring MongoDB 在结果中只获取值而不是 key:value的主要内容,如果未能解决你的问题,请参考以下文章

在 MongoDB 中搜索任何字段的值而不显式命名它

在spring boot中仅获取值而不是JSON响应中的键和值

spring data mongodb Query 及分页

获取 timePicker 值而不显示 timePicker 对话框

有没有办法从函数中获取值而不返回它? [关闭]

我们如何在 firstVC 中获取 secondVC json 值而不快速进入 secondVC