我一直在寻找答案,但我确信我迷失了正确的词来描述我的追求。
基本上,我有一个名为“ people”的mongodb集合,该集合的架构如下:
people: { name: String, friends: [{firstName: String, lastName: String}] }
现在,我有一个非常基本的express应用程序,该应用程序连接到数据库并成功地使用一个空的friends数组创建了“ people”。
在应用程序的次要位置,有一个添加好友的表单。该表单接受firstName和lastName,然后包含名称字段的POST,也用于引用适当的people对象。
我很难做的是创建一个新的朋友对象,然后将其“推送”到friends数组中。
我知道,当我通过mongo控制台执行此操作时,我将$ push作为update函数用作查找条件之后的第二个参数,但是我似乎找不到合适的方法来使猫鼬执行此操作。
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' };
var friend = { firstName: 'Harry', lastName: 'Potter' };
您有两种选择:
更新内存中的模型,然后保存(纯javascript array.push):
person.friends.push(friend); person.save(done);
要么
PersonModel.update( { _id: person._id }, { $push: { friends: friend } }, done );
我总是尽可能地尝试第一种选择,因为它会尊重猫鼬为您带来的更多好处(钩子,验证等)。
但是,如果您同时进行大量写入操作,则会遇到竞争状况,最终会导致讨厌的版本错误,从而使您无法每次更换整个模型并失去之前添加的朋友。因此,仅在绝对必要时才使用前者。