我在尝试从集合中的特定对象获取字段值时,发现了这个问题。我的研究显示,Mongo没有提供本地返回对象中特定字段值的方法。(令人失望的是,就像在SQL或JSONPath中一样能够返回特定字段的值似乎是相当基础的要求)。
为了解决这个问题,我使用Java 11中的Spring MongoDB编写了以下方法:
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.MongoTemplate;
import java.util.Arrays;
import static java.util.Objects.requireNonNull;
public <T> T getFieldValueById(String objectId, String fieldValueToReturn, String collectionName, Class<T> classTypeToReturn) {
var query = new Query().addCriteria(Criteria.where("_id").is(objectId));
query.fields().include(fieldValueToReturn);
var result = mongoTemplate.findOne(query, org.bson.Document.class, collectionName);
requireNonNull(result, "Did not find any documents with id '" + objectId + "' in collection: " + collectionName);
return result.getEmbedded(Arrays.asList(fieldValueToReturn.split("\\.")), classTypeToReturn);
}
getEmbedded
调用允许我们获取返回的Bson文档中嵌套字段的值。
要使用该方法,只需像这样调用它:
getFieldValueById("A1234", "field.nestedfield.nestedfield", "collectionName", String.class);
希望这能帮助其他寻找如何做到这一点的人。
顺便提一下,我不确定如何将其扩展为返回对象列表-如果遇到这个问题并解决了它,我会尝试更新此答案。我也不确定这是否比运行Mongo聚合查询更慢-我没有尝试在两种方法之间运行任何性能比较。
编辑2022-09-30:要返回自定义Pojo的列表,似乎必须使用spring-data-mongodb通过聚合查询。另外,基本查询似乎比聚合查询更快,因此在可能的情况下请使用基本查询。