8

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

假设我在 MongoDB 中有一些带有版本属性的文档,例如 { ..., version: { major: 1, minor: 2, patch: 13 } },或者{ ..., version: "1.2.13" }如果它更容易。

查找所有版本为 XYZ 或更高版本的文档的最简单方法是什么?我现在这样做的方式基本上是一个巨大的 $and 子句。

4

2 回答 2

5

你的第一个设计实际上非常好。原因是您可以索引字段majorminorpatch进行快速读取。

查询数据实际上比使用$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数组中的每个表达式生成多个查询并执行联合。这比我上面提供的查询示例要贵得多。

于 2013-07-22T02:20:26.597 回答
2

如果您使用固定位数的版本号并将其存储为字符串,您应该可以使用$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
于 2013-07-21T16:18:29.563 回答