查找具有最大 semver 版本的对象
Find an object with biggest semver version
假设我在 MongoDB 中有一些文档带有 version
属性(semver 版本),例如 { ..., version: { major: 1, minor: 2, patch: 13 } }
或 { ..., version: "1.2.13" }
,我还没有决定我将使用哪种格式。
我需要找到 version
最高的文档。
例如,如果集合有两个 {..., version: "0.10.0"}
和 {..., version: "1.0.0"}
的文档,那么我想获取 version = "1.0.0"
的文档
我正在使用 Spring 数据 MongoDB,所以理想情况下我想通过使用 Criteria API
找到一些解决方案
当我使用 version
:
的第一种格式时,结果很简单
{ ..., version: { major: 1, minor: 2, patch: 13 } }
然后我可以按所有这三个字段进行排序,然后取一个顶级文档:
db.metadata.find({})
.projection({})
.sort({ "version.major": -1, "version.minor": -1, "version.patch": -1 })
.limit(1)
这个查询是用Criteria API
写的:
public Metadata getLatestMetadata() {
Criteria criteria = Criteria
.where("type").is(TEST_TYPE);
Query query = Query.query(criteria).with(getVersionSort()).limit(1);
return mongoOperations.findOne(query, Metadata.class);
}
private Sort getVersionSort() {
return Sort.by(new Sort.Order(Sort.Direction.DESC, "version.major"),
new Sort.Order(Sort.Direction.DESC, "version.minor"),
new Sort.Order(Sort.Direction.DESC, "version.patch"));
}
假设我在 MongoDB 中有一些文档带有 version
属性(semver 版本),例如 { ..., version: { major: 1, minor: 2, patch: 13 } }
或 { ..., version: "1.2.13" }
,我还没有决定我将使用哪种格式。
我需要找到 version
最高的文档。
例如,如果集合有两个 {..., version: "0.10.0"}
和 {..., version: "1.0.0"}
的文档,那么我想获取 version = "1.0.0"
我正在使用 Spring 数据 MongoDB,所以理想情况下我想通过使用 Criteria API
当我使用 version
:
的第一种格式时,结果很简单
{ ..., version: { major: 1, minor: 2, patch: 13 } }
然后我可以按所有这三个字段进行排序,然后取一个顶级文档:
db.metadata.find({})
.projection({})
.sort({ "version.major": -1, "version.minor": -1, "version.patch": -1 })
.limit(1)
这个查询是用Criteria API
写的:
public Metadata getLatestMetadata() {
Criteria criteria = Criteria
.where("type").is(TEST_TYPE);
Query query = Query.query(criteria).with(getVersionSort()).limit(1);
return mongoOperations.findOne(query, Metadata.class);
}
private Sort getVersionSort() {
return Sort.by(new Sort.Order(Sort.Direction.DESC, "version.major"),
new Sort.Order(Sort.Direction.DESC, "version.minor"),
new Sort.Order(Sort.Direction.DESC, "version.patch"));
}