2015-06-14 60 views
3

在試圖更新文檔,我發現了。上述錯誤的字段timesToDisplay

MongoDB的版本2.6.7

整個模型:。

msg = { 
      'name': '', 
      'template': '', 
      'displayDurInMilliSec': 0, 
      'timesToDisplay': [], 
      'images': [], 
      'texts': [], 
      'screen': [] 
     } 

我想我會得到同樣的錯誤與其他3數組字段

我嘗試過使用$set,但是sill得到相同的錯誤。

的代碼:

function updateMessage(msg) { 
    var conditions = {_id: msg._id} 
     , update = { 'name': msg.name, 
        'template': msg.template, 
        'displayDurInMilliSec': msg.displayDurInMilliSec, 
        'timesToDisplay': msg.timesToDisplay, 
        'images': msg.images, 
        'texts': msg.texts, 
        'screen': msg.screen 
    } 

    messageModel.update(conditions, update, callback); 

    function callback(err, numAffected) { 
     if (!err) console.log(numAffected) 
     else console.log(err) 
    } 
} 

編輯:msg參數是文檔本身:

{ _id: '557d58abd54955480db6694f', 
    name: 'msg99', 
    timesToDisplay: [ { startDate: '2015-06-19T21:00:00.000Z', 
        '$$hashKey': 'object:214', 
        endDate: '2015-06-25T21:00:00.000Z', 
        daysOfTheWeek: [Object], 
        startTimeOfDay: '11', 
        endTimeOfDay: '13' } ], 
images: [], 
texts: [], 
screen: [ 1 ], 
'$$hashKey': 'object:54', 
displayDurInMilliSec: '40189', 
template: 'templates/Template2.html' } 
+0

那麼這是一個非常簡單的信息。不幸的是,您並未向您顯示您在「msg」變量中包含的內容。這是毫無疑問的問題。加上**真的很糟糕的方式來做到這一點**。你應該用**'$ set' **和**'$ push' **和其他運營商不只是更新「代替」整個文檔。 – 2015-06-14 12:19:34

+0

感謝您的評論,我編輯了這個問題。我想我需要刪除'$$ hashKey'字段。 – DeepSpace

+1

你確實需要這樣做。任何帶有'$'的前綴「都被認爲是」保留的「。 MongoDB在各個領域使用這些前面的「操作符」。因此,使用'$'前綴嘗試命名存儲區域是非法的。夠清楚了嗎?該消息確實應該有全文。 – 2015-06-14 12:37:53

回答

4

$$hashkey場由AngularJS與ngRepeat或ngOptions工作時加入。在ngRepeat的情況下,你可以通過附加track by $index將其更改重複字符串。對於使用ngOptions,您必須自己過濾掉該字段。 AngularJS提供了一個過濾出來的快速解決方案:angular.toJson。這將過濾掉以兩個美元符號爲前綴的所有字段。 Check out the documentation

我知道這是不是一個MongoDB的答案,但此特定錯誤($$ hashkey),通常是由於AngularJS。