通过mongoose将物品推入蒙戈列
我已经search了很好的一点寻找答案,但我相信我迷失了正确的话来描述我后。
基本上我有一个名为“人”的mongodb集合该集合的架构如下:
people: { name: String, friends: [{firstName: String, lastName: String}] }
现在,我有一个非常基本的快速应用程序连接到数据库,并成功地创build一个空的朋友数组的“人”。
在申请的次要位置,有一个表格可以添加朋友。 表单接受firstName和lastName,然后POST名称字段也用于引用正确的人员对象。
我很难做的是创build一个新的朋友对象,然后“推”到朋友arrays。
我知道,当我通过mongo控制台执行此操作时,我使用$ push的更新函数作为查找条件后的第二个参数,但似乎无法find合适的方法让mongoose执行此操作。
db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});
更新:所以,阿德里安的答案是非常有帮助的。 以下是我为了实现我的目标所做的。
在我的app.js文件中,我使用了一个临时路由
app.get('/addfriend', users.addFriend);
在我的users.js文件中,我有
exports.addFriend = function (req, res, next) { var friend = {"firstName": req.body.fName, "lastName": req.body.lName}; Users.findOneAndUpdate({name: req.user.name}, {$push: {friends: friend}}); };
假设, var friend = { firstName: 'Harry', lastName: 'Potter' };
有两个选项:
更新内存中的模型,并保存(纯JavaScript数组。
person.friends.push(friend); person.save(done);
要么
PersonModel.update( { _id: person._id }, { $push: { friends: friend } }, done );
我总是尽可能地尝试第一种方法,因为它会尊重mongoose带给你的更多好处(挂钩,validation等)。
但是,如果您正在进行大量并发写入操作,那么您将遇到竞争情况,最终会出现令人讨厌的版本错误,从而导致您无法每次都更换整个模型,并丢失了以前添加的好友。 所以只有在绝对必要的情况下才能进入后者。