【问题标题】:Update value inside mongodb array object更新 mongodb 数组对象中的值
【发布时间】:2020-01-29 22:46:03
【问题描述】:

我正在尝试更新我的对象数组中的值。 查看上面的 mongoDB 模式,我想要的是: 查找 ID 与 _id 匹配的费用,并需要使用 req.body 中的新字段更新字段。 只需要更新:费用类型、描述、价格和状态。

以下代码是我尝试做的。 首先,我需要匹配正确的费用,它可以正常工作,但是当我尝试 house.save() 时,会显示一条消息“house.save 不是函数”。所以我想也许我需要使用 mongoDB 函数来获取结果。

router.put("/editExpense/:id", ensureAuthenticated, (req, res) => {
  var id = mongoose.Types.ObjectId(req.params.id);
  House.find(
    { "expensesHouse._id": id },
    {
      members: 1,
      name: 1,
      description: 1,
      address: 1,
      type: 1,
      user: 1,
      userID: 1,
      userType: 1,
      expensesHouse: { $elemMatch: { _id: id } },
      date: 1
    }
  ).then(house => {
    console.log(house);
    expenseType = req.body.expenseType;
    description = req.body.description;
    price = req.body.price;
    status = req.body.status;

    house.save().then(() => {
      req.flash("success_msg", "Expenses Updated");
      res.redirect("/houses/dashboard");
    });
  });
});

******更新******

经过搜索,我找到了这个 updateOne,经过调整,这是我的最终结果,但这样我删除了每条记录..

router.put("/editExpense/:id", ensureAuthenticated, (req, res) => {
  var id = mongoose.Types.ObjectId(req.params.id);
  House.updateOne(
    { "expensesHouse._id": id },
    {
      members: 1,
      name: 1,
      description: 1,
      address: 1,
      type: 1,
      user: 1,
      userID: 1,
      userType: 1,
      expensesHouse: { $elemMatch: { _id: id } },
      date: 1
    },
    { $set: { "expensesHouse.expenseType": req.body.expenseType } }
  ).then(house => {
    req.flash("success_msg", "Expenses Updated");
    res.redirect("/houses/dashboard");
  });
});

*********** 分辨率 *********** 我只是按照下面显示的方式解决了问题。

 House.updateOne(
{ "expensesHouse._id": id },
{
  $set: {
    expensesHouse: {
      expenseType: req.body.expenseType,
      description: req.body.description,
      price: req.body.price,
      status: req.body.status
    }
  }
}

【问题讨论】:

    标签: javascript node.js mongodb mongodb-query


    【解决方案1】:

    你现在真的很接近答案了,你现在遇到的问题是findUpdateOne之间的语法差异

    这是Find 所期望的,检查MongoDB docs

    db.collection.find(query, projection)

    这是updateOne 所期望的,检查Mongo docs

     db.collection.updateOne(
       <filter>,
       <update>,
       {
         upsert: <boolean>,
         writeConcern: <document>,
         collation: <document>,
         arrayFilters: [ <filterdocument1>, ... ],
         hint:  <document|string>        // Available starting in MongoDB 4.2.1
       }
    )
    

    看到区别了吗?第二个参数应该是 update 而不是 projection 因为更新一个 返回

    • ma​​tchedCount 包含匹配文档的数量
    • modifiedCount 包含修改文档的数量
    • upsertedId 包含 upserted 文档的 _id。
    • 如果操作运行时带有写入关注点,则布尔值确认为 true;如果写入关注点被禁用,则确认为 false。

    所以你的代码应该是

    House.updateOne(
        { "expensesHouse._id": id },
        { $set: { "expensesHouse.expenseType": req.body.expenseType } }
      ).then(house => {
        req.flash("success_msg", "Expenses Updated");
        res.redirect("/houses/dashboard");
      });
    });
    

    【讨论】:

    • 返回一个错误:MongoError: Cannot create field 'description' in element 我认为它试图在我拥有的数组中创建一个新字段。
    • 我是否应该将 Router.PUT 更改为其他任何内容?它不能工作..
    【解决方案2】:
    House.findOneAndUpdate({userId : req.params.userId}, 
        { $set: { "expensesHouse.$[element].status": req.body.status } },
        { multi:true, arrayFilters: [{ "element.userID" : req.params.subUserId }], new:true })
    

    您的 Api 请求包含两个 ID(外部和内部),例如 /api/update/:userId/:subUserId

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多