比较MongoDB中的版本

比较MongoDB中的版本,mongodb,versioning,nosql,Mongodb,Versioning,Nosql,只是想知道是否有人能想出一个更聪明的方法来做到这一点 假设我在MongoDB中有一些文档具有版本属性,例如 {…,版本:{major:1,minor:2,patch:13},或者{…,版本:“1.2.13”},如果更简单的话 查找所有具有X.Y.Z或更高版本的文档的最简单方法是什么?我现在使用的方法基本上是一个巨大的$and子句。如果您对版本号使用固定位数并将其存储为字符串,您应该能够使用$gte "001.002.0013" > "001.002.0011" = true "001.00

只是想知道是否有人能想出一个更聪明的方法来做到这一点

假设我在MongoDB中有一些文档具有版本属性,例如
{…,版本:{major:1,minor:2,patch:13}
,或者
{…,版本:“1.2.13”}
,如果更简单的话


查找所有具有X.Y.Z或更高版本的文档的最简单方法是什么?我现在使用的方法基本上是一个巨大的$and子句。

如果您对版本号使用固定位数并将其存储为字符串,您应该能够使用
$gte

"001.002.0013" > "001.002.0011" = true
"001.003.0013" > "001.002.0013" = true
"002.000.0000" > "001.002.0013" = true
"001.002.0012" > "001.002.0013" = false
"001.001.0013" > "001.002.0013" = false

你的第一个设计其实很好。原因是您可以索引字段
major
minor
patch
,以便快速读取

查询数据实际上比使用
$和
查询容易得多。您只需对匹配字段使用基本查询:

e、 g

您可以创建一个索引,如

db.versions.ensureIndex({major:1,minor:1,patch:1})
$和
查询主要用于在同一字段上多次运行更复杂查询的情况。例如,如果您想获得主要版本1和2,可以使用
$和


db.versions.find({major:1,major:2})
实际上只返回主版本为2的文档。但是,
db.versions.find({a:$all:[1,2]})
在这种情况下也可以工作。理想情况下,应尽量避免使用
$和
,因为它实际上会为
$和
数组中的每个表达式生成多个查询并执行并集。这比我上面提供的查询示例要昂贵得多。

我也是这么想的。这种方法的问题是1.0.0实际上比0.10.1大。在这种情况下,$lte和$gte的查询实际上取决于主要(或次要)版本。例如,我想获取所有1.0.0或更低版本的文档。一个可以获取所有1.0.0或更低版本文档的查询是db.versions.find({major:{$lte:1}})。由于您将字段分开,因此实际上可以独立地查询它们,例如db.versions.find({minor:$in[1,10]})//给我所有具有1或10的minor版本。我明白了。您需要使用$或一个表达式来处理即时版本,另一个表达式来处理其余版本。例如)版本<1.1.1$或:[{major:1,minor:{$lte:1},patch:{$lte:1},{major:{$lt:1}]。版本>2.2.2:$或:[{major:2,minor:{$gte:2},patch:{$gte:2},{major:{gt:2}]。或者,你可以做一个混合的方法,你在不同的字段中存储主、次、补丁,用于相等匹配,另一个字段用于范围(例如,(主*10000)+(次*100)+补丁)是的,我想这是最简单的方法。谢谢你的意见。
db.versions.ensureIndex({major:1,minor:1,patch:1})