mongodb - 在 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);
}
}
)
})
}
但是,我仍然无法弄清楚如何获取参与数组的最后一个匹配元素而不是第一个。任何指针?
解决方案
推荐阅读
- angular - Angular如何使用嵌套的ng-template测试嵌套组件?
- python - 在 Python 中的嵌套列表中拆分字符串并转换为浮点数?
- c# - 使用 JSON 创建 Excel
- python - 我们不能访问驻留在类中的方法中的变量吗
- r - R data.table 创建简单的自定义函数
- c# - 我将如何更改此代码以使用指定的播放器范围而不是使用 Raycast?
- javascript - 从表格导出到 Firebase 的格式
- python - 使用 PHP 的本地 Sqlite3 数据库:超文本预处理器
- javascript - 未使用 Dotnet 核心和 javascript 为 PDFTron 加载库,库 simpe_wasm 存在问题
- r - 无法格式化计算的滑块最小值和最大值以减少小数位