为了账号安全,请及时绑定邮箱和手机立即绑定

通过猫鼬将项目推入mongo数组

通过猫鼬将项目推入mongo数组

茅侃侃 2019-06-29 10:08:07
通过猫鼬将项目推入mongo数组我已经找了很好的答案,但我相信我迷失了正确的词语来描述我的目标。基本上,我有一个名为“People”的MongoDB集合,该集合的模式如下所示:people: {          name: String,           friends: [{firstName: String, lastName: String}]         }现在,我有了一个非常基本的Express应用程序,它连接到数据库,并使用一个空的朋友数组成功地创建了“People”。在应用程序的次要位置,有一个表单可以添加朋友。表单接受FirstName和LastName,然后使用name字段发布,并引用适当的People对象。我很难做的是创建一个新的朋友对象,然后将它“推”到“朋友”数组中。我知道,当我通过mongo控制台执行此操作时,我使用了UPDATE函数,并将$Push作为查找条件之后的第二个参数,但我似乎找不到让猫鼬这样做的适当方法。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}});};
查看完整描述

3 回答

?
米琪卡哇伊

TA贡献1998条经验 获得超6个赞

假设,var friend = { firstName: 'Harry', lastName: 'Potter' };

有两种选择:

更新内存中的模型并保存(普通javascript array.ush):

person.friends.push(friend);person.save(done);

PersonModel.update(
    { _id: person._id }, 
    { $push: { friends: friend } },
    done);

我总是在可能的时候尝试第一种选择,因为它会尊重猫鼬给你带来的更多好处(钩子、验证等等)。

然而,如果您正在进行大量并发写操作,您将遇到竞争条件,最终会出现严重的版本错误,从而阻止您每次替换整个模型,并失去您添加的前一个朋友。所以只有在绝对必要的时候才去前者。


查看完整回答
反对 回复 2019-06-29
?
饮歌长啸

TA贡献1951条经验 获得超3个赞

这个$Push运算符将指定的值追加到数组中。

{ $push: { <field1>: <value1>, ... } }

$Push添加以值作为其元素的数组字段。

上面的答案满足了所有的要求,但我做了以下工作

var objFriends = { fname:"fname",lname:"lname",surname:"surname" };Friend.findOneAndUpdate(
   { _id: req.body.id }, 
   { $push: { friends: objFriends  } },
  function (error, success) {
        if (error) {
            console.log(error);
        } else {
            console.log(success);
        }
    });)


查看完整回答
反对 回复 2019-06-29
  • 3 回答
  • 0 关注
  • 561 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信