2014-10-10 39 views
0

我的文档具有以下属性的集合:在Mongo中,如何匹配基于范围的文档?

{ 
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

蒙戈应该返回第一个文件:

因为

11 <= 12 <= 15 and 11 <= 14 <= 15

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

上面的公式是

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

这是蒙戈查询我试图使用的当前迭代:

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)

我的主要问题是,我不知道如何写在这蒙哥匹配条件:

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

回答

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

这正是我想要的结果。我试图让我的匹配查询过于复杂。我记得我的查询的第一次迭代看起来与您答案中的查询非常相似,但我的后面是$ lte和$ gte。直到今天才注意到。 – ILikeTacos 2014-10-10 15:07:36

+0

你会熟悉这种表达(BSON)和一些练习。 :) – Wizard 2014-10-10 15:12:13