首页 > 解决方案 > 在 Mongo 中更新嵌套数组对象

问题描述

我有一个如下所示的 StudentClass 集合:

[
{
  "_id": ObjectId("60923c997b4d3205009a981a"),
  "attended": [
    {
      "in": "2021-05-05T06:35:05.226+00:00",
      "out": "2021-05-05T06:45:05.226+00:00"
    },
    {
      "in": "2021-05-05T06:47:05.226+00:00",
      "out": "2021-05-05T06:55:05.226+00:00"
    },
    {
      "in": "2021-05-05T06:56:05.226+00:00"
    },
    {
      "in": "2021-03-03T07:10:00.628Z"
    }
  ],
  "studentId": ObjectId("608a42e8224c549ad9a9ab51"),
  "active": true
},
{
  "_id": ObjectId("6098f6f974af29682772fbe6"),
  "attended": [
    {
      "in": "2021-05-05T06:35:05.226+00:00",
      "out": "2021-05-05T06:55:05.226+00:00"
    },
    {
      "in": "2021-05-05T06:59:05.226+00:00",
      "out": "2021-05-05T07:20:05.226+00:00"
    }
  ],
  "studentId": ObjectId("608a42e8224c549ad9a9ab51"),
  "active": true
},
{
  "_id": ObjectId("6098f6f974af29682772fbe7"),
  "attended": [],
  "studentId": ObjectId("608a42e8224c549ad9a9ab51"),
  "active": true
}]

对于给定的_id,我需要根据以下条件更新参与的数组:需要找到最后一个缺少键数组元素。与其他数组元素一样,参与的数组元素应该使用out键进行更新。

这是我尝试过的:

const markStudentExitFromClass = (studentClassId, exitTime) => {

    return new Promise((resolve, reject) => {
        StudentClasses.updateOne(
            { _id: new mongoose.Types.ObjectId(studentClassId), "attended.out" : {$exists: false}}, 
            { $set: { "attended.$.out": new Date(exitTime) } }, 
            function (err, updatedData) {
                if (err) {
                    reject(err);
                } else {
                    resolve(updatedData);
                }
            }
        )
    })
}

这不会更新给定 _id的参与数组的任何数组元素。就像$位置运算符找到第一个数组元素一样,最后一个数组元素有什么吗?

我究竟做错了什么?

更新:因此,我通过将 updateOne 的匹配子句更改为:

const markStudentExitFromClass = (studentClassId, exitTime) => {

    return new Promise((resolve, reject) => {
        StudentClasses.updateOne(
            { _id: new mongoose.Types.ObjectId(studentClassId), "attended" :{"$elemMatch":{"out":{$exists: false}}} }, 
            { $set: { "attended.$.out": new Date(exitTime) } }, 
            function (err, updatedData) {
                if (err) {
                    reject(err);
                } else {
                    resolve(updatedData);
                }
            }
        )
    })
}

但是,我仍然无法弄清楚如何获取参与数组的最后一个匹配元素而不是第一个。任何指针?

标签: mongodbmongoose

解决方案


推荐阅读