2016-11-05 62 views
0

考慮的模式具有以下屬性:如何使用Mongoose投影中的另一個計算字段創建計算字段?

{ 
    maxDmg: Number, 
    attacks: Number 
} 

我需要創建一個計算字段,其中包括從另一個計算字段的結果,是這樣的:

$project { 
    maxDmg: true, 
    attacks: true, 
    effDmg: { $multiply: ["$maxDmg", 0.70] }, 
    dps: { $divide: [ {$multiply:["$effDmg","$attacks"]}, 60 ] } 
} 

但它看起來像計算列'effDmg'不能在另一個計算列中被引用。有沒有解決方法?

回答

1

我不認爲你可以訪問現有的計算變量,但你可以使用let opertor創建相同的計算變量,並在另一個計算變量中使用。希望這可以幫助。

$project: { 
    maxDmg: true, 
    attacks: true, 
    effDmg: { 
     $multiply: ["$maxDmg", 0.70] 
    }, 
    dps: { 
     $let: { 
      vars: { 
       effDmg: { 
        $multiply: ["$maxDmg", 0.70] 
       } 
      }, 
      in: { 
       $divide: [{ 
        $multiply: ["$$effDmg", "$attacks"] 
       }, 60] 
      } 
     } 
    } 
} 

更新

你可以保持一個計算項目中,以後你可以投射出來。至少你最終重用這些變量。

$project: { 
    maxDmg: true, 
    attacks: true, 
    together: { 
     $let: { 
      vars: { 
       effDmg: { 
        $multiply: ["$maxDmg", 0.70] 
       } 
      }, 
      in: { 
       dps: { 
        $divide: [{ 
         $multiply: ["$$effDmg", "$attacks"] 
        }, 60] 
       }, 
       effDmg: "$$effDmg" 
      } 
     } 
    } 
} 

樣本輸出:

{ 
    "maxDmg": 34, 
    "attacks": 45, 
    "together": { 
     "dps": 17.849999999999998, 
     "effDmg": 23.799999999999997 
    } 
} 
+0

槽糕。不是我希望得到的答案,因爲計算實際上比我在示例中使用的方法複雜得多,我想避免代碼重複。不過,學到了一些新東西,謝謝! – amnesia

+0

已更新。看看是否有幫助。您可以添加另一個項目來提取值。 – Veeram

+0

哦,是的,好點;我經常忽略這些明顯的。這對我有用,謝謝。 – amnesia