📅  最后修改于: 2023-12-03 14:55:16.073000             🧑  作者: Mango
在 Mongoose 中更新嵌套对象数组可能有些棘手,但是使用正确的技术和方法可以轻松完成。在本文中,我们将介绍如何使用以下三种方法来更新嵌套的对象数组:
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 方法。这些方法提供了多种选项来更新文档,包括 $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 中的对象数组可能看起来有些困难,但是随着您的熟练程度提高,它变得更加容易。这些方法将使您更轻松地更新和管理嵌套的对象数组。