Mongodb 更新Mongo中的嵌套数组对象
我有一个StudentClass集合,如下所示: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
[
{
"_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”不是空的。请看类似的问题,我认为没有更好的方法来执行此单一查询。