关于java:如何从MongoDB中检索特定的元素列表?

How do I retrieve particular List of element from MongoDB?

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

假设我在Employee类中有两个变量-:

1
2
3
4
5
6
public Class Employee
{
private String Id;
private String Name;
.
.

现在,当我进行fetch查询时,它将类似于-:

1
List<Employee> list=mongoTemplate.findAll();

然后我将循环访问每个Employee对象以获取Employee ID并保存在List中。

现在,我想要的解决方案是这样的,我可以一次检索到所有ID。比如-:

1
List<String> employeeId = someCodeHere;

如果可以请帮忙

事先谢谢。


根据Mongos关于不同操作的参考文件:

Finds the distinct values for a specified field across a single collection or view and returns the results in an array.

在Spring Data MongoDB中,可以这样实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);

MongoTemplate在这里为distinct提供了一些重载。primer查询将直接收集员工集合条目的所有ID,而后者只对名称中包含and的员工ID进行筛选。

为了将iterable结果集转换为请求的字符串对象列表,可以使用guava的newArray(...)功能。

正如@veeram在他的评论中提到的,您当然也可以使用像

1
2
3
4
Query query = Query.query(Criteria.where(...));
query.fields().include("id");

return mongoTemplate.find(query, String.class);

其中,query.fields().include("id")用于指定您实际感兴趣的字段。

distinct相比,此方法将在结果列表中包含重复条目(如果有)。虽然ID通常应该是唯一的,但是对名称执行这两个查询可能会产生包含多个相同条目的结果。

虽然@boris给出的答案在技术上也是有效的,但它可能会对性能产生一些影响,不幸的是,特别是当许多嵌入和引用的文档也需要检索时。因此,我不建议采用这种方法。

最后注意:在整个示例中,我保持了EDCOX1 1和EDCX1字段10小写字母的字段,因为这基本上是Java命名约定。


可以使用Java流API:

1
2
3
4
5
6
private List<String> getEmployeeIds() {
  return mongoTemplate.findAll().stream()
    .map(Employee::getId)
    .filter(Objects::nonNull)
    .collect(toList());
}

首先查询所有员工,然后转换为流,将Employee映射到Id,然后将所有非空值聚合到列表中。

如果您的EDCOX1(2)使用Java流查询方法:

1
Stream<Employee> findAll();

那么您不需要在getEmployeeIds()中调用stream()方法。

编辑:添加了从流中筛选空值