提问者:小点点

通过mongoose将项目推入mongo数组


我花了很长时间寻找答案,但我确信我找不到合适的词来描述我所追求的东西。

基本上,我有一个名为'people'的mongodb集合,该集合的模式如下所示:

people: {
         name: String, 
         friends: [{firstName: String, lastName: String}]
        }

现在,我有了一个非常基本的express应用程序,它连接到数据库,并用一个空的friends数组成功地创建了'people'。

在应用程序的次要位置,一个表单就位,可以添加好友。该表单接受firstName和lastName,然后发布name字段,以引用适当的people对象。

我很难做的是创建一个新的friends对象,然后将它“推入”friends数组。

我知道,当我通过mongo控制台执行此操作时,我使用了更新函数,并将$push作为查找条件之后的第二个参数,但我似乎找不到让mongoose执行此操作的适当方法。

db.people.update({name: "John"}, {$push: {friends: {firstName: "Harry", lastName: "Potter"}}});

共2个答案

匿名用户

假设,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
);

我总是尽可能地选择第一个选项,因为它更尊重mongoose给你的好处(钩子、验证等)。

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

匿名用户

$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);
        }
    });
)