我已经浏览了mongoose API,以及关于SO和google组的许多问题,但仍无法弄清楚更新嵌入式文档.
我正在尝试使用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
pkyeck.. 8
当你已经拥有这个用户时,你可以这样做:
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
查找子文档
每个文档都有一个_id.DocumentArrays有一个特殊的id方法,用于通过_id查找文档.
var doc = parent.children.id(id);
**警告**
正如@zach所指出的那样,你必须在实际文档的模式之前声明子文档的模式才能使用该id()
方法.
当你已经拥有这个用户时,你可以这样做:
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
查找子文档
每个文档都有一个_id.DocumentArrays有一个特殊的id方法,用于通过_id查找文档.
var doc = parent.children.id(id);
**警告**
正如@zach所指出的那样,你必须在实际文档的模式之前声明子文档的模式才能使用该id()
方法.