2015-02-07 49 views
0

我在節點/快遞/貓鼬中有一個場景,我有積累積分的用戶,當積分超過某個閾值時,他們「升級」(以基於積分的級別思考遊戲)。來自另一個字段的setter的Mongoose更新依賴字段?

我已經在點字段上創建了一個自定義setter,用於檢查值是否已更改,如果是,則嘗試更新級別字段。級別在另一個集合中定義,但在與用戶文檔(因此查詢中的.lean())關聯時保存爲簡單的JSON對象。我以這種方式對虛擬領域或人口進行效率分析。

問題:這實際上並沒有更新用戶'級別'字段。我究竟做錯了什麼?

// Define our user schema 
var UserSchema = new mongoose.Schema({ 
    ... 
    points:  {type: Number, default: 0, set: pointsChangeHandler}, 
    level:  {name: String, minPoints: Number, maxPoints: Number}, 
    ... 
}); 

以及設置器看起來像這樣:作出

function goodPointsChangeHandler(newValue) { 
    var self = this; 
    if (newValue != self.goodPoints) { 
     console.log('Point change detected.'); 
     // Find level that corresponds with new point total 
     Level.findOne({ 
      'minPoints': {$lte : self.goodPoints}, 
      'maxPoints': {$gt : self.goodPoints}}, '-_id').lean().exec(function(err, level) { 
      if (self.goodLevel == undefined || self.goodLevel.rank != level.rank) { 
       console.log('Level changed.'); 
       self.goodLevel = level; 
      } 
      return newValue; 
     }); 
    } 
    return newValue; 
} 
+0

你似乎並不實際要保存'()'荷蘭國際集團的文件。 – laggingreflex 2015-02-07 17:17:55

+0

我在這裏看到過類似的問題http://thatextramile.be/blog/2011/08/using-mongooses-setters-to-get-calculated-properties/其中沒有明確的save()。根據那篇文章,我假設'this'在函數返回後被保存 - 如果不是這樣,那麼這就是我的問題... – 2015-02-07 17:32:56

+0

您必須明確地保存它才能將更改保存到數據庫中。 – laggingreflex 2015-02-07 17:34:47

回答

2

基於@ laggingreflex的評論,我試過模型方法的範圍內修改this(即不在Level.findOne()回調,並改變方式堅持沒有明確save()電話。

而且,我有我在那裏從返回NEWVALUE一個非常愚蠢的錯誤findOne`回調..不知道我在想什麼有...

長話短說,這可能是明顯的節點/快遞/貓鼬的專家,但你可以修改一個比其他領域其目前的設置方法,但是當您發現自己處於另一個異步方法的回調中時,您必須執行明確的save()或您對this的修改不會被保留。

所以:

function myFieldSetterMethod(newValue) { 
    this.myField = "a"; 
    this.myOtherField = "b"; 
    return newValue; 
    // no save() necessary, this will update both fields 
} 

function myFieldSetterMethod(newValue) { 
    this.myField = "a"; 

    SomeModel.findOne(..., function(err, doc) { 
     this.myOtherField = doc.somethingIWantFromThisDoc; 
     // now you'll need an explicit save 
     // this.save(...) 
    }); 

    return newValue;  
} 
相關問題