Mongodb 更新Mongo中的嵌套数组对象

Mongodb 更新Mongo中的嵌套数组对象,mongodb,mongoose,Mongodb,Mongoose,我有一个StudentClass集合,如下所示: [ { "_id": ObjectId("60923c997b4d3205009a981a"), "attended": [ { "in": "2021-05-05T06:35:05.226+00:00", "out": "2021-05-05T06:45:05.226+00:0

我有一个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,我需要根据以下条件更新attended数组: 需要查找缺少out键的最后一个数组元素。和其他数组元素一样,attended的数组元素应该使用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的match子句更改为:

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);
                }
            }
        )
    })
}

但是,我仍然不知道如何获取参与的数组的最后一个匹配元素,而不是第一个。有任何指针吗?

如果
“attended”:[],根据您的上一个文档,
为空,该怎么办?还有另一个方法在调用此方法之前及时更新。所以,无论何时调用此方法,我们都可以假设“attended”不是空的。请看类似的问题,我认为没有更好的方法来执行此单一查询。