2011-08-12 91 views
8

我已經瀏覽了貓鼬API,以及許多關於SO和谷歌組的問題,但仍然無法弄清楚更新嵌入式文檔。如何在貓鼬中更新嵌入式文件?

我想用args的內容更新這個特定的userListings對象。

for (var i = 0; i < req.user.userListings.length; i++) { 
    if (req.user.userListings[i].listingId == req.params.listingId) { 
     User.update({ 
      _id: req.user._id, 
      'userListings._id': req.user.userListings[i]._id 
     }, { 
      'userListings.isRead': args.isRead, 
      'userListings.isFavorite': args.isFavorite, 
      'userListings.isArchived': args.isArchived 
     }, function(err, user) { 
      res.send(user); 
     }); 
    } 
} 

下面是模式:

var userListingSchema = new mongoose.Schema({ 
    listingId: ObjectId, 
    isRead: { 
     type: Boolean, 
     default: true 
    }, 
    isFavorite: { 
     type: Boolean, 
     default: false 
    }, 
    isArchived: { 
     type: Boolean, 
     default: false 
    } 
}); 

var userSchema = new mongoose.Schema({ 
    userListings: [userListingSchema] 
}); 

這個發現也不起作用,這可能是第一個問題:

User.find({ 
    '_id': req.user._id, 
    'userListings._id': req.user.userListings[i]._id 
}, function(err, user) { 
    console.log(err ? err : user); 
}); 

返回:

{ stack: [Getter/Setter], 
    arguments: [ 'path', undefined ], 
    type: 'non_object_property_call', 
    message: [Getter/Setter] } 

這應該是th的等價物是蒙戈客戶端調用:

db.users.find({'userListings._id': ObjectId("4e44850101fde3a3f3000002"), _id: ObjectId("4e4483912bb87f8ef2000212")}) 

運行:

mongoose v1.8.1 
mongoose-auth v0.0.11 
node v0.4.10 

回答

6

當你已經擁有的用戶,你可以做這樣的事情:

var listing = req.user.userListings.id(req.params.listingId); 

listing.isRead = args.isRead; 
listing.isFavorite = args.isFavorite; 
listing.isArchived = args.isArchived; 

req.user.save(function (err) { 
    // ... 
}); 

爲在這裏找到:http://mongoosejs.com/docs/subdocs.html

Finding a sub-document

Each document has an _id. DocumentArrays have a special id method for looking up a document by its _id.

var doc = parent.children.id(id); 

*警告*

爲@zach指出,您必須在實際文檔的模式之前聲明子文檔的模式才能夠使用id()方法。

+2

我得到「類型錯誤的方式:對象[對象對象],[目標對象],[目標對象],[目標對象]有沒有方法「身份證'「 – FrederickCook

+0

這是一個貓鼬身份驗證問題?這就是req.user分配的地方。 – FrederickCook

+0

貓鼬記錄說:「DocumentArrays有一個特殊的方法ID,它通過_id屬性(每個嵌入式文檔得到一個)來過濾嵌入式文檔」。但我自己沒有嘗試過。 – pkyeck

0

這只是對變量的名稱不匹配?

您在for循環中有user.userListings[i].listingId,但在find中有user.userListings[i]._id

您是否在尋找listingId_id

0

您必須保存父對象,並markModified嵌套的文檔。

That's我們做

exports.update = function(req, res) { 
    if(req.body._id) { delete req.body._id; } 
    Profile.findById(req.params.id, function (err, profile) { 
    if (err) { return handleError(res, err); } 
    if(!profile) { return res.send(404); } 
    var updated = _.merge(profile, req.body); 
    updated.markModified('NestedObj'); 
    updated.save(function (err) { 
     if (err) { return handleError(res, err); } 
     return res.json(200, profile); 
    }); 
    }); 
};