通过 mongoose 将项目推送到 mongo 数组中

新手上路,请多包涵

基本上我有一个名为’people’的mongodb集合,其架构如下:

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

现在,我有一个非常基本的快速应用程序,它连接到数据库并成功地创建了一个带有空朋友数组的“人”。

在应用程序的次要位置,有一个用于添加朋友的表单。该表单接受 firstName 和 lastName ,然后带有 name 字段的 POST 也用于引用正确的人员对象。

我很难做的是创建一个新的朋友对象,然后将其“推送”到朋友数组中。

我知道当我通过 mongo 控制台执行此操作时,我使用 $push 作为查找标准后的第二个参数的更新功能,但我似乎找不到合适的方法让 mongoose 执行此操作.

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

原文由 Neurax 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 653
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 给你的更多好处(钩子、验证等)。

但是,如果您正在执行大量并发写入,您将遇到竞争条件,最终会出现令人讨厌的版本错误,以阻止您每次替换整个模型并失去您添加的前一个朋友。因此,只有在绝对必要时才使用后者。

原文由 Adrian Schneider 发布,翻译遵循 CC BY-SA 4.0 许可协议

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

原文由 Parth Raval 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题