我浏览了猫鼬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
当您已有用户时,您可以执行以下操作:
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);
查找子文档
每个文档都有一个_id。DocumentArrays具有特殊的id方法,用于通过其_id查找文档。
var doc = parent.children.id(id);
* 警告 *
正如@zach指出的那样,您必须在实际文档的架构之前声明子文档的架构才能使用该id()方法。
id()