【问题标题】:Comparing versions in MongoDB比较 MongoDB 中的版本
【发布时间】:2013-07-21 08:11:15
【问题描述】:

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

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

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

【问题讨论】:

    标签: mongodb versioning nosql


    【解决方案1】:

    您的第一个设计实际上非常好。原因是您可以索引字段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 数组中的每个表达式生成多个查询并执行联合。这比我上面提供的查询示例要贵得多。

    【讨论】:

    • 我也是这么想的。这种方法的问题在于 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 的版本。
    • 我明白了。您将需要使用 $or 使用一个表达式来处理即时版本,而使用一个表达式来处理其余版本。例如)版本 2.2.2:$or:[{major:2,minor:{$gte:2},patch:{$gte:2}},{major:{gt:2}}]。或者,您可以采用混合方法,将主要、次要、补丁存储在单独的字段中以进行相等匹配,并在另一个字段中存储范围(例如(主要*10000)+(次要*100)+补丁)
    • 是的,我想这是最简单的方法。感谢您的意见。
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-09
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 1970-01-01
      • 2022-10-24
      • 1970-01-01
      • 2022-11-11
      相关资源
      最近更新 更多