2016-03-29 150 views
0

我有模型: 其中stats.d是當前日期和t和u是一些統計。貓鼬陣列和子陣列更新

name: string, 
stats: [{ 
    d: {type: date, default: moment().format('MM/DD/YYYY')}, 
    t: number, 
    u: number, 
}], 
total: number 

什麼,我要做的是更新,檢查是否今天的日期是如果今天增量T,如果今天的日期是不存在的,創建或與當前的日期和出發點t添加項統計數據陣列。所以我會按日期統計。這是我嘗試過的。

model.findOneAndUpdate({_id:req.params._id}, {$set:{"stats.d": date}, $inc: {total: 1, "stats.t": 1}}, {upsert:true}, function(err, data){ 

//success 
}); 

但它不工作。我收到以下錯誤:

can't append to array using string field name: t","code":13048,"ok":0 

請問這個問題嗎?

回答

1

我不認爲你可以在一個update查詢中做到這一點。

但是你可以使用javascript

model.findOne(
    { 
     _id: ObjectId("req.params._id") 
    }, 
    function(err, data){ 
     var isDateFound = false; 

     for (var i = 0; i < data.stats.length; i++) { 
      if (data.stats[i].d === date) { 
       isDateFound = true; 
       data.stats[i].t++; 
       break; 
      } 
     } 

     if (!isDateFound) { 
      data.stats.push({ 
       d: date, 
       t: 1, 
       u: 0 
      }) 
     } 

     data.total++; 

     model.save(data) // or data.save() should work as well 
}); 

沒有upsert要求,有可能增加匹配的數組元素:

db.test.update(
    { 
     _id: ObjectId("req.params._id"), 
     'stats.d': date 
    }, 
    { 
     $inc: { 
      'stats.$.t': 1, 
      'total': 1 
     } 
    } 
) 
+0

並非所有的,但我需要更新stats.t地方統計.d是當前日期以及總數 – karma

+1

@karma,因此請相應地更改您的問題,但這完全不瞭解。它看起來像你正在嘗試更新所有元素。 – TomG

+0

謝謝,我已更新問題並予以澄清。 – karma