Java 如何从MongoDB中检索特定的元素列表?
我想从Mongodb表中检索元素的特定列表 假设我的Employee类中有两个变量-:Java 如何从MongoDB中检索特定的元素列表?,java,mongodb,spring-boot,Java,Mongodb,Spring Boot,我想从Mongodb表中检索元素的特定列表 假设我的Employee类中有两个变量-: public Class Employee { private String Id; private String Name; . . 现在,当我进行fetch查询时,它将类似于-: List<Employee> list=mongoTemplate.findAll(); List List=mongoTemplate.findAll(); 然后我将循环遍历每个employee对象以获取员工
public Class Employee
{
private String Id;
private String Name;
.
.
现在,当我进行fetch查询时,它将类似于-:
List<Employee> list=mongoTemplate.findAll();
List List=mongoTemplate.findAll();
然后我将循环遍历每个employee对象以获取员工ID并保存在列表中
现在,我希望解决方案能够一次检索所有ID。类似-:
List<String> employeeId = someCodeHere;
List employeeId=someCodeHere;
如果可以,请帮忙
提前感谢。您可以使用:
private List getEmployeeIds(){
返回mongoTemplate.findAll().stream()
.map(Employee::getId)
.filter(对象::非空)
.collect(toList());
}
首先查询所有员工,然后转换为流,将Employee
映射到Id
,然后将所有值聚合到一个列表中
如果您的存储库使用Java流:
streamfindall();
然后您不需要在getEmployeeIds()
中调用stream()
方法
编辑:添加了从流中过滤空值的功能您可以使用:
private List getEmployeeIds(){
返回mongoTemplate.findAll().stream()
.map(Employee::getId)
.filter(对象::非空)
.collect(toList());
}
首先查询所有员工,然后转换为流,将Employee
映射到Id
,然后将所有值聚合到一个列表中
如果您的存储库使用Java流:
streamfindall();
然后您不需要在getEmployeeIds()
中调用stream()
方法
编辑:添加了根据操作从流中过滤空值的功能:
在单个集合或视图中查找指定字段的不同值,并在数组中返回结果
在Spring Data MongoDB中,可以这样实现:
DistinctIterable<String> distinctIds =
mongoTemplate.getCollection(mongoTemplate.getCollectionName(Employee.class))
.distinct("id", String.class);
return Lists.newArrayList(distinctIds);
// or
BasicDBObject dbObject = new BasicDBObject();
dbObject.append("name", new BasicDBObject("$regex", ".*and.*"));
DistinctIterable<String> distinctIds =
mongoTemplate.getCollection(mongoTemplate.getCollectionName(Employee.class))
.distinct("id", dbObject, String.class);
return Lists.newArrayList(distinctIds);
其中query.fields().include(“id”)
用于指定您实际感兴趣的字段
与distinct
不同的是,这种方法将在结果列表中包含重复条目(如果有)。虽然ID通常应该是唯一的,但对名称执行这两个查询可能会产生包含多个相同项的结果
尽管@Boris给出的答案在技术上也是有效的,但不幸的是,它可能会对性能产生一些影响,特别是当需要检索大量嵌入和引用的文档时。因此,我不建议采取这种做法
最后注意:在整个示例中,我将Id
和Name
字段保留为小写字母,因为基本上是这样。根据操作:
在单个集合或视图中查找指定字段的不同值,并在数组中返回结果
在Spring Data MongoDB中,可以这样实现:
DistinctIterable<String> distinctIds =
mongoTemplate.getCollection(mongoTemplate.getCollectionName(Employee.class))
.distinct("id", String.class);
return Lists.newArrayList(distinctIds);
// or
BasicDBObject dbObject = new BasicDBObject();
dbObject.append("name", new BasicDBObject("$regex", ".*and.*"));
DistinctIterable<String> distinctIds =
mongoTemplate.getCollection(mongoTemplate.getCollectionName(Employee.class))
.distinct("id", dbObject, String.class);
return Lists.newArrayList(distinctIds);
其中query.fields().include(“id”)
用于指定您实际感兴趣的字段
与distinct
不同的是,这种方法将在结果列表中包含重复条目(如果有)。虽然ID通常应该是唯一的,但对名称执行这两个查询可能会产生包含多个相同项的结果
尽管@Boris给出的答案在技术上也是有效的,但不幸的是,它可能会对性能产生一些影响,特别是当需要检索大量嵌入和引用的文档时。因此,我不建议采取这种做法
最后一点注意:在整个示例中,我将Id
和Name
字段保留为小写字母,因为基本上是这样的。一年后,您可以使用以下代码完成所需操作:
List<String> employeeIds= mongoTemplate.query(Employee.class).distinct("id").as(String.class).all();
List employeeIds=mongoTemplate.query(Employee.class).distinct(“id”).as(String.class).all();
无需进行任何转换。我也遇到过同样的情况,并通过这样做解决了问题。一年后,您可以使用以下代码完成所需的操作:
List<String> employeeIds= mongoTemplate.query(Employee.class).distinct("id").as(String.class).all();
List employeeIds=mongoTemplate.query(Employee.class).distinct(“id”).as(String.class).all();
无需进行任何转换。我遇到了同样的情况,并通过这样做解决了它。尝试Query Query=new Query();query.fields()。包括(“Id”);List employeeIds=mongoTemplate.find(查询,String.class)
谢谢@Veeram的回复..试试Query Query=new Query();query.fields()。包括(“Id”);List employeeIds=mongoTemplate.find(查询,String.class)
感谢@Veeram的回复..感谢Boris的回复能否告诉我如何确保不将空值添加到我们的列表中?@rishabbansal您可以使用此选项从列表中删除空值list.removeAll(Collections.singleton(null))
但是当您使用Streams时,这就是答案。filter(Objects::nonNull)
@Boris这是最优的吗?我的意思是,有没有办法在数据库查询中做到这一点?谢谢Boris的回复。您能告诉我如何确保不将空值添加到我们的列表中吗?@rishabbBansal您可以使用此方法从列表中删除空值list.removeAll(Collections.singleton(null))
但是当您使用Streams时,这就是答案。filter(Objects::nonNull)
@Boris这是最优的吗?我的意思是,有没有一种方法可以在数据库查询中实现这一点?