📌  相关文章
📜  更新 mongoose 中的对象数组 - Javascript (1)

📅  最后修改于: 2023-12-03 14:55:16.073000             🧑  作者: Mango

更新 Mongoose 中的对象数组 - Javascript

在 Mongoose 中更新嵌套对象数组可能有些棘手,但是使用正确的技术和方法可以轻松完成。在本文中,我们将介绍如何使用以下三种方法来更新嵌套的对象数组:

  1. 找到并更新特定的子文档
  2. 找到并更新文档数组中的所有子文档
  3. 使用 updateOne 或 findOneAndUpdate 方法更新嵌套的对象数组
找到并更新特定的子文档

Mongoose 提供了一种找到并更新特定子文档的方法,其基本语法如下所示:

Model.findById(id, function(err, parentDoc) {
  if (err) return handleError(err);
  
  var docToUpdate = parentDoc.child.id(childId);
  docToUpdate.name = 'new name';
  
  parentDoc.save(function(err) {
    if (err) return handleError(err);
  });
});

这个例子假设我们有一个模型(Model)和一个带有子文档(child documents)的父文档(parent document)。要更新特定的子文档,我们需要使用 findById 方法找到父文档,使用 child.id 方法找到要更新的子文档。一旦找到了子文档,我们就可以更新它的属性并调用父文档的 save 方法来保存更改。

找到并更新文档数组中的所有子文档

如果您需要在文档数组中更新所有子文档,可以使用 Mongoose 的 $ 操作符和 updateOne 方法。下面是一个基本的语法示例:

Model.updateOne({'_id': parentId}, 
              {$set: {'children.$[].name': 'new name'}}, 
              function(err, result) {
  if (err) return handleError(err);
});

此示例假设我们有一个名为 Model 的模型和一个带有子文档的文档数组。要更新文档数组中的所有子文档,我们需要提供父文档的 id,使用 $ 操作符选中文档数组中的每个子文档(children.$[]),然后使用 $set 操作符设置子文档的属性。我们还可以传递一个回调函数,以便在更新完成时调用。

使用 updateOne 或 findOneAndUpdate 方法更新嵌套的对象数组

如果您想更改嵌套的对象数组中的属性,可以使用 updateOne 或 findOneAndUpdate 方法。这些方法提供了多种选项来更新文档,包括 $push、$pull、$set 和 $addToSet 等方法。示例代码如下:

Model.updateOne({_id: parentId, 'children._id': childId}, 
               {$set: {'children.$.name': 'new name'}}, 
               function(err, result) {
  if (err) return handleError(err);
});

Model.findOneAndUpdate({_id: parentId, 'children._id': childId}, 
                        {$set: {'children.$.name': 'new name'}},
                        {new: true},
                        function(err, updatedDoc) {
  if (err) return handleError(err);
});

这些方法假设我们有一个名为 Model 的模型、一个带有子文档的文档和一个要更新的特定子文档的 id。要使用 updateOne 或 findOneAndUpdate 方法,我们需要提供一个查询选择器来选择要更新的文档。我们还可以使用 $ 操作符来选择特定的子文档。接下来,我们需要使用 $set 操作符来设置子文档的属性。请注意,我们在第二个示例中还使用了选项对象,该对象包含“new: true”选项,这将返回更新后的文档。

总的来说,更新 Mongoose 中的对象数组可能看起来有些困难,但是随着您的熟练程度提高,它变得更加容易。这些方法将使您更轻松地更新和管理嵌套的对象数组。