【问题标题】:MongoDB: Query float range on arrayMongoDB:查询数组上的浮点范围
【发布时间】:2013-10-15 11:24:47
【问题描述】:

我在使用 mongo-shell 和 Spring Data Mongodb 时遇到了一种奇怪的行为

这是我的示例查询:

> db.substances.find({"precursor.mass": {$gte:159.9900,$lte:160.0100}}).count()
6

所以我想找到给定范围(加/减)内的质量值。在此示例中,输入为 160 +/- 0.01。

这是六个结果中的两个。第一个没问题,但我无法解释和理解为什么会找到第二个结果。

{
"_id" : ObjectId("524bfe80729458abfd7698a5"),
"exactMass" : 159.1259,
"nominalMass" : 159,
"molarMass" : 159.22,
"status" : 1,
"decompositions" : [ ],
"precursor" : [
    {
        "mass" : 160,
        "ion" : "+H",
        "charge" : "+",
        "fragments" : [
            55,
            83,
            124,
            97,
            69,
            142
        ]
    }
],
}

{
"_id" : ObjectId("524bfe80729458abfd7695be"),
"exactMass" : 159.068414,
"nominalMass" : 159,
"molarMass" : 159.19,
"status" : 0,
"decompositions" : [ ],
"precursor" : [
    {
        "mass" : 158.0611,
        "ion" : "-H",
        "charge" : "-",
        "fragments" : [ ]
    },
    {
        "mass" : 160.0756,
        "ion" : "+H",
        "charge" : "+",
        "fragments" : [ ]
    }
],
}

我忽略了什么?我假设我使用了错误的查询?

我的目标是找到所有前体质量在给定值 +/- 公差之间的物质。

【问题讨论】:

    标签: java javascript spring mongodb


    【解决方案1】:

    来自mongo doc on find()

    如果一个字段包含一个数组并且您的查询有多个条件 运算符,如果单个数组中的任何一个,则整个字段将匹配 元素满足条件或数组元素的组合满足 条件

    因此,由于 {"mass" : 158.0611} 匹配第二个查询条件(小于 160.0100),而 {"mass" : 160.0756} 匹配第一个(大于 159.9900),因此整个数组都匹配。

    你要找的是$elemMatch:

    db.substances.find({
      "precursor": { 
        $elemMatch: {
          mass: { $gt:159.9900, $lt:160.0100 }
        }
      }
    }).pretty()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多