首页 > 解决方案 > 如何使用 findByIdAndUpdate 使用 Mongoose 更改子数组

问题描述

我正在创建一个 MEAN 堆栈来执行列表,并且需要以下 Mongoose 语法的帮助。

我正在尝试将 todos 数组的已完成字段更新为 true。通过研究,我能够使用 Mongoose 模型 findOneAndUpdate 更新我的子文档。

但是,我也在尝试学习如何使用 findByIdAndUpdate。我似乎无法让它工作。我哪里错了?

我的带有嵌套子文档待办事项的 Mongoose 文档:

{
    //this is my userID
    "_id": ObjectId("5b21cbdeebe2b414906b2b31"),
    "username": "john",
    "todos": [{
        // this is my id
        "_id": ObjectId("5b21cbdeebe2b414906b2b32"),
        "item": "testing",
        "completed": false
    }, {
        // this is my id
        "_id": ObjectId("5b22dd570f15b72e949591f6"),
        "item": "adding new",
        "completed": false
    }]
}

我的猫鼬功能:

module.exports.markItemCompleted = function(id, callback) {
  Item.findByIdAndUpdate(id, { $set: { completed: true }}, callback);
}

标签: node.jsmongodbmongoose

解决方案


您需要使用$[] 位置运算符来更新数组中的每个元素

module.exports.markItemCompleted = function(id, callback) {
  Item.update(
    { _id: id },
    { $set: { 'todos.$[].completed': true }}, callback
  );
}

注意:你应该有mongodb 版本 3.6


推荐阅读