node.js - MongoDB按值更新数组元素匹配
问题描述
我的数据库包含这样的 mongo db 对象:
[{
_id:ObjectId("..."),
subjects:[
{
subjectId: ObjectId("1")
name: "Physics",
marksObtained:80,
rank:0
},
{
subjectId: ObjectId("2")
name: "Chemistry",
marksObtained:70,
rank:0
},
{
subjectId: ObjectId("3")
name: "Maths",
marksObtained:80,
rank:0
}
]
}...]
现在,我正在尝试提高分数低于 90 的每个人的数学排名。为此,我使用以下查询:
db.getCollection('test_attempts').updateMany({
"subjects.subjectId": ObjectId("3"),
"subjects.marksObtained":{$lt:90}
},
{
$inc: {
"subjects.$.rank": 1
}
});
如果物理的分数低于 90,此代码将更新物理对象的排名而不是数学。在主题物理的分数超过 90 时,它会更新化学对象。
不知何故,它忽略了查询中的 subjectId 并使用匹配的标记更新了数组的第一个对象。
不知道我做错了什么。
主题中的 PS ObjectId 仅用于代表性目的。
解决方案
"subjects.subjectId": ObjectId("3"),
"subjects.marksObtained":{$lt:90}
上面的查询将搜索不同文档中的字段( subjectId
, ),marksObtained
尝试$elemMatch
运算符匹配同一文档中的两个字段,
db.getCollection('test_attempts').updateMany({
subjects: {
$elemMatch: {
subjectId: ObjectId("3"),
marksObtained: { $lt:90 }
}
}
},
{
$inc: {
"subjects.$.rank": 1
}
});
推荐阅读
- amazon-cloudformation - 外部依赖项的 AWS CDK 模式
- macos - 特使 - 断言失败:interface_index == 0
- mysql - 授予以特定字符集开头的 mysql 模式的所有权限
- python - 如何使用命令 Discord.py 更改用户的昵称
- python - 使用子进程-python-windows 为 ssh 密钥注入密码
- sql - 出于标准化目的,关联这些表的最佳方式是什么?与一个实体的 2 个关系 vs 与另一个实体的 1 个关系
- if-statement - 我们如何为 SML 中的 if-then-else 表达式实现 eval 函数案例?
- pandas - AttributeError:“float”对象没有属性“isnumeric”
- ffmpeg - Dash.js 不播放用 ffmpeg 制作的 mpd 文件
- r - 为每个观察单位创建两个新的对应行