2012-06-14 71 views
1

我有一個貓鼬的模式看起來像這樣,我能更新和查詢就好了:無法一個蒙戈文檔中更新嵌入項目(無法更新)

// Subscriber Schema 
var Subscriber = new Schema({ 
    'user': ObjectId, 
    'level': { type: String, enum: [ 'sub', 'poster', 'blocked' ] }, //blocked means users has opted out of list 
    'dateAdded': { type: Date, default: Date.now } 
}); 

// Group Schema 
var Group = new Schema({ 
    'groupEmail': { type: String, lowercase: true, validate: [validatePresenceOf, 'an email is required'], index: { unique: true } }, 
    'groupOwner': ObjectId, 
    'groupName': String, 
    'twitterFeed': String, 
    'subscribers': [Subscriber], 
    'createdAt': { type: Date, default: Date.now } 
}); 

我想更新組文檔中的訂閱者,並更改其級別,然後保存更改。我能夠找到組恰好使用:

Group.findOne({ _id: req.params.groupId }, function(err, g) 

一旦我有了組,我想找到一個訂戶,以便我可以更新它。如果我嘗試:

g.subscribers.update({ 'user': req.params.userId }, { level: newStatus }); 

我得到:

TypeError: Object { user: 4fc53a71163006ed0f000002, 
    level: 'sub', 
    _id: 4fd8fa225904a5451c000006, 
    dateAdded: Wed, 13 Jun 2012 20:37:54 GMT },{ user: 4fda25ac00cd9bdc4f000004, 
    level: 'sub', 
    _id: 4fda270bbce9f8d058000005, 
    dateAdded: Thu, 14 Jun 2012 18:01:47 GMT },{ user: 4fda2a634499dfd16e00000d, 
    level: 'sub', 
    _id: 4fda2a634499dfd16e00000e, 
    dateAdded: Thu, 14 Jun 2012 18:16:03 GMT } has no method 'update' 

我嘗試更新的各種排列,查找等,但總是能得到「沒有法」的錯誤。我究竟做錯了什麼?有沒有不同的方式我應該更新Subscriber.level?

謝謝!

回答

0

我想你會得到錯誤,因爲你在實例上調用更新,而不是模型。

也許嘗試這樣的事:

Group.update(
    {_id: req.params.groupId, subscribers.user: req.params.userId}, 
    { subscribers.level: newStatus }, function(err, result) {} 
); 
+0

沒有快樂。編譯「意外」錯誤。與subscribers.user和subscribers.level「當我嘗試上述,如果我把這兩個引號我得到:'MongoError:不能追加到數組使用字符串字段名稱[級別]' – pat

2

@eltoro大多是正確的,數組沒有一個update方法,以及使用Group.update的建議是一個很好的,但更新句法缺少$subscribers.$.level

Group.update(
    {_id: req.params.groupId, 'subscribers.user': req.params.userId}, 
    { 'subscribers.$.level': newStatus }, function(err, result) {} 
);