Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何从MongoDB中检索特定的元素列表?_Java_Mongodb_Spring Boot - Fatal编程技术网

Java 如何从MongoDB中检索特定的元素列表?

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对象以获取员工

我想从Mongodb表中检索元素的特定列表

假设我的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这是最优的吗?我的意思是,有没有一种方法可以在数据库查询中实现这一点?