如何使用猫鼬更新深层嵌套对象数组中的对象?

问题描述 投票:0回答:2

我正在尝试更新猫鼬中深层嵌套数组中的对象的值,但无法想出正确的语法。

我已经尝试了原子更新和更新 mongodb 中项目的传统方法,但仍然没有成功。

我想更新 'history[index].rideConfirmations[index].rideComplete.driverConfirmed

//driverHistorySchema.js
const mongoose = require("mongoose");

const DriversRideHistorySchema = new mongoose.Schema(
  {
    driverId: mongoose.Schema.ObjectId,
    driverName: String,
    history: [
      {
        date: String,
        rideConfirmations: [
          {
            riderConfirmationTime: String,
            driverConfirmationTime: String,
            riderName: String,
            riderId: mongoose.Schema.ObjectId,
            rideComplete: {
              riderConfirmed: Boolean,
              driverConfirmed: Boolean,
            },
          },
        ],
      },
    ],
  },
  { timestamps: true, collection: "driversRideHistory" }
);

module.exports = mongoose.model("DriversRideHistory", DriversRideHistorySchema);


我想更新 'history[index].rideConfirmations[index].rideComplete.driverConfirmed

router.put("/rideHistory/completeRide", async (req, res) => {
  try {
    const { driverId, dateIndex, riderIndex } = req.body;

    await DriversHistoryModel.findOneAndUpdate(
      {
        driverId: driverId,
      },
      {
        $set: {
          "history.$[dateIndex].rideConfirmations.$[riderIndex].rideComplete.driverConfirmed": true,
        },
      },
      { arrayFilters: [{ dateIndex: dateIndex }, { riderIndex: riderIndex }] }
    );

    return res.status(200).send("Ride Completed Successfully");
  } catch (err) {
    console.log(err);
    return res
      .status(404)
      .send("An error occured while processing this request");
  }
});

module.exports = router;
javascript node.js mongodb mongoose mongoose-schema
2个回答
0
投票
router.put("/rideHistory/completeRide", async (req, res) => {
  console.log(req.body);
  try {
    const { driverId, dateIndex, riderIndex } = req.body;
    //Update history on driver's profile first
    const driver = await DriversHistoryModel.findOne({
      driverId,
    });

    const dateToUpdate =
      driver.history[dateIndex].rideConfirmations[riderIndex];

    dateToUpdate.rideComplete.driverConfirmed = true;

    await driver.save();

    return res.status(200).send(dateToUpdate);


    return res.status(200).send("Ride Completed Successfully");
  } catch (err) {
    console.log(err);
    return res
      .status(404)
      .send("An error occured while processing this request");
  }
});

0
投票

要更新 Mongoose 中深度嵌套数组中对象的值,可以使用位置 $ 运算符结合点符号。这是一个基本示例:

DriverHistoryModel.findOneAndUpdate(
      { "nestedArray._id": objectIdOfParentDocument, "nestedArray.nestedArray2._id": objectIdOfNestedDocument },
      { $set: { "nestedArray.$.nestedArray2.$[elem].propertyName": newValue } },
      { arrayFilters: [{ "elem._id": objectIdOfDesiredElement }] },
      function(err, doc) {
        // Handle error or updated document
      }
    );
© www.soinside.com 2019 - 2024. All rights reserved.