在Mongo中,如何匹配基于范围的文档?

时间:2014-10-10 14:39:55

标签: mongodb

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

{
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 AND minEmployees <= userInput2 <= maxEmployees

1 个答案:

答案 0 :(得分:2)

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

{
    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" ]
            } ]
        }
    }
} ]);