如何更新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); }); }); };