2014-10-10 81 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