Artifactory 强制人工在搜索时使用数值比较?
我正在尝试查找RPM包的最新(或最早,取决于比较运算符)版本(RPM位很重要)。我使用的AQL查询与此类似:Artifactory 强制人工在搜索时使用数值比较?,artifactory,artifactory-query-lang,Artifactory,Artifactory Query Lang,我正在尝试查找RPM包的最新(或最早,取决于比较运算符)版本(RPM位很重要)。我使用的AQL查询与此类似: items.find( { "$and" : [ { "@rpm.metadata.name": { "$eq": "awesome_package"}}, { "@rpm.metadata.version": { "$gte": "19.300.0.58"}} ] }) .include("@rpm.metadata.version")
items.find(
{ "$and" : [
{ "@rpm.metadata.name": { "$eq": "awesome_package"}},
{ "@rpm.metadata.version": { "$gte": "19.300.0.58"}} ]
})
.include("@rpm.metadata.version")
.sort( { "$asc": [ "name" ]})
正如Artifactory KnowledgeBase已经回答的那样,因此,我必须在find
子句中使用属性条件,而不是仅对@rpm.metadata.version
进行排序,并使用.limit(1)
获得第一个顶级结果
虽然Artifactory的内置比较是纯粹的字典式比较,但是对于上面的查询,我得到了以下结果:
{
"results" : [ {
"repo" : "yum-private-local",
"path" : "some/path",
"name" : "awesome_package-19.300.0.9-1.noarch.rpm",
"properties" : [ {
"key" : "rpm.metadata.version",
"value" : "19.300.0.9"
} ]
},{
"repo" : "yum-private-local",
"path" : "some/path",
"name" : "awesome_package-19.300.0.58-0.noarch.rpm",
"properties" : [ {
"key" : "rpm.metadata.version",
"value" : "19.300.0.58"
} ]
},{
"repo" : "yum-private-local",
"path" : "some/path",
"name" : "awesome_package-19.300.0.59-0.noarch.rpm",
"properties" : [ {
"key" : "rpm.metadata.version",
"value" : "19.300.0.59"
} ]
} ],
"range" : {
"start_pos" : 0,
"end_pos" : 3,
"total" : 3
}
}
这个结果包括版本19.300.0.9,它比我正在搜索的版本旧(>=19.300.0.58),不应该包含在结果中,但是Artifactory发现了它,很可能是因为它的搜索比较是字典式的
还要注意结果的顺序,似乎使用了数字排序(版本“19.300.0.9”在“19.300.0.58”和“19.300.0.59”之前)
问题:是否可以强制Artifactory在搜索条件中使用数值()比较?如果没有,是否有其他方法可以从结果列表中排除不相关的版本?虽然不符合要求,但如果由创建的字段进行,则不进行名称排序也会很有帮助
created:
.include(“@rpm.metadata.version”).sort({“$asc”:[“name”]})——您已经按照asc顺序和name字段对结果进行了排序。这是大于等于19.300.0.58的最早版本吗?@error404:是的,我在名称字段上进行了排序,不支持对属性(例如@rpm.metadata.version)进行排序。事实上,
sort
子句在这里是不相关的:我的主要问题是,我希望在结果中只得到两个匹配项(.58和.59),但我也得到了一个(更早).9.我觉得结果是正确的。awesome_包的版本-19.300.0.9-1.noarch.rpm将高于上一个版本,因为这个版本以-1而不是-0结尾。如果是-0,则结果不应是aql@error404:-1
实际上是一个名为@rpm.metadata.release
的属性,与搜索时使用的@rpm.metadata.version
属性无关。Artifactory正确地为部署的工件解析EVR(epoch/version/release):如果我使用项搜索工件。find({“$and”:[{{@rpm.metadata.name:{“$eq:“awesome_package”},{“@rpm.metadata.version:{$eq:“19.300.0.9”}}})
我只得到一个结果(如预期的那样)。只是$gte
比较将版本视为字符串,忽略列出(不同)比较语义的RPM规范。好的,我没有使用RPM,所以不知道使用的属性。您不能使用created_by field获取最新版本吗?谢谢,将您的评论升级为可接受的解决方法。