通过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等)。

但是,如果您正在进行大量并发写入操作,那么您将遇到竞争情况,最终会出现令人讨厌的版本错误,从而导致您无法每次都更换整个模型,并丢失了以前添加的好友。 所以只有在绝对必要的情况下才能进入后者。