【问题标题】:In Mongo, how to match documents based with ranges?在 Mongo 中,如何匹配基于范围的文档?
【发布时间】:2014-10-10 14:39:54
【问题描述】:

我有一组具有以下属性的文档:

{
name: "Acme",
minEmployees: 11,
maxEmployees: 15,
price: 20,
priceMultiplierEmployees: 1.5
}

{
name: "Acme",
minEmployees: 0,
maxEmployees: 10,
price: 10
priceMultiplierEmployees: 1.2
}

{
name: "Acme",
minEmployees: 16
maxEmployees: 20
price: 50,
priceMultiplierEmployees: 1.6
}

如果我的一位用户输入minEmployees = 12maxEmployees = 14

Mongo 应该返回第一个文档:

因为

11 <= 12 <= 1511 <= 14 <= 15

但是我在 Mongo 中创建匹配条件时遇到了问题(我还很新)。我一遍又一遍地阅读文档,但我不断得到与某些文档不匹配的结果。

上面的公式是

documentMinEmployees <= userInputMinEmployees <= documentMaxEmployeesdocumentMinEmployees <= userInputMaxEmployees <= documentMaxEmployees

这是我正在尝试使用的 mongo 查询的当前迭代:

db.products.aggregate(
   [
    {
      $match: { 
        name: "Acme",
        minEmployees: {$lte: 12}
      }
    },
    {
      $group: {
        _id:  {name: "$name", price: "$price"},
        lowEndEmployees: {
          $max: "$minEmployees"
        },
        finalPrice: {
          $max: {
            $add: ["$price", {$multiply: ["$priceMultiplierEmployees", {$subtract: [12, "$minEmployees"]}]}]
          }
        }
      }
    }
   ]
);

上面的查询,现在正在返回以下文档(如预期的那样):

{
name: "Acme",
minEmployees: 11,
maxEmployees: 15,
price: 20,
priceMultiplierEmployees: 1.5
}

{
name: "Acme",
minEmployees: 0,
maxEmployees: 10,
price: 10
priceMultiplierEmployees: 1.2
}

但我希望它返回的只是一个具有以下结果的文档。

{
name: "Acme",
price: 20,
finalPrice: 30
}

其中finalPrice 是以下操作的结果:20 * 1.5(12 - 11)

我的主要问题是我不知道如何在Mongo中编写这个匹配条件:

minEmployees <= userInput <= maxEmployees minEmployees <= userInput2 <= maxEmployees

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    根据你想要的最终结果如下:

    {
        name: "Acme",
        price: 20,
        finalPrice: 30
    }
    

    你可以使用:

    var min = 12, max = 14; 
    db.products.aggregate([ {
        $match : {
            name : "Acme",
            minEmployees : {
                $lte : min
            },
            maxEmployees : {
                $gte : max
            }
        }
    }, {
        $project : {
            _id : 0,
            name : "$name",
            price : "$price",
            finalPrice : {
                $multiply : [ "$price", "$priceMultiplierEmployees", {
                    $subtract : [ min, "$minEmployees" ]
                } ]
            }
        }
    } ]);
    

    【讨论】:

    • 这正是我想要的结果。我试图使我的匹配查询过于复杂。我记得我的第一次查询迭代看起来与您的答案非常相似,但我有 $lte 和 $gte 倒退。直到今天才注意到。
    • 你会通过一些练习来熟悉这种表达方式(BSON)。 :)
    猜你喜欢
    • 2011-09-26
    • 2018-03-09
    • 2018-01-07
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多