如何更新mongooseembedded式文件?

我已经浏览了mongooseAPI,还有很多关于SO和谷歌组的问题,但仍然无法弄清楚更新embedded式文档。

我试图用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] } 

这应该是这个mongo客户端调用的等价物:

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

运行:

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

当你已经有用户的时候,你可以做这样的事情:

 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

find一个子文件

每个文档都有一个_id。 DocumentArrays有一个特殊的id方法来查找文档的_id。

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

* * 警告 * *

正如@zach指出的那样,你必须在实际文档的模式之前声明子文档的模式才能使用id()方法。

这只是variables名称不匹配?

for循环中有user.userListings[i].listingId ,但在user.userListings[i].listingId中有user.userListings[i]._id

你在寻找listingId_id吗?

您必须保存父对象,并markModified嵌套的文档。

这就是我们这样做的方式

 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); }); }); };