2013-07-21 79 views
4

只是想知道如果任何人都可以想出一个聪明的方式做到这一点...比较版本MongoDB中

比方说,我在MongoDB的一些文件有一个版本属性,例如像 { ..., version: { major: 1, minor: 2, patch: 13 } },或者{ ..., version: "1.2.13" }如果它更容易。

找到所有X.Y.Z或更高版本的文档最简单的方法是什么?我现在这样做的方式基本上是一个巨大的$和子句。

回答

1

你的第一个设计其实是非常好的。原因是因为您可以对major,minorpatch进行索引以获得快速读取。

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

例如

db.versions.find({major:1,minor:2,patch:20}) //give me documents of version 1.2.20 
db.versions.find({major:1}) //give me all documents with major version 1 
db.versions.find({major:1,minor:{$gte:2,$lte:5}}) //give me all documents of major version and minor versions between 2 and 5 inclusive. 

您可以创建一个像

db.versions.ensureIndex({major:1,minor:1,patch:1}) 

$and查询主要是要运行相同的字段多次在更复杂的查询时的指标。例如,如果您想要获得主版本1和2,则可以使用$and

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

+0

这就是我的想法。这种方法的问题是1.0.0实际上大于0.10.1。在这种情况下,使用$ lte和$ gte的查询实际上取决于主要(或次要)版本。 例如,我想抓取所有文档1.0.0或更低版本。 – Leander

+0

一个将获得所有文档1.0.0或更低版本的查询将是db.versions.find({major:{$ lte:1}})。既然你打破了领域,你可以实际查询他们独立例如。 db.versions.find({minor:$ in [1,10]})//给我所有具有次要版本1或10的版本。 –

+0

啊,也许1.0.0是一个不好的例子。如果我选择1.1.0,那么它不会工作... – Leander

1

如果您为版本号使用固定数量的数字并将其存储为字符串,则应该可以使用$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