Node.js MongoDB按值更新数组元素匹配
我的数据库包含以下mongo db对象:Node.js MongoDB按值更新数组元素匹配,node.js,mongodb,mongoose,Node.js,Mongodb,Mongoose,我的数据库包含以下mongo db对象: [{ _id:ObjectId("..."), subjects:[ { subjectId: ObjectId("1") name: "Physics", marksObtained:80, rank:0 }, { subjectId: ObjectId("
[{
_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,并使用匹配的marksotained条件更新数组的第一个对象
不知道我做错了什么
受试者中的p.S.对象仅用于代表性目的
"subjects.subjectId": ObjectId("3"),
"subjects.marksObtained":{$lt:90}
上述查询将搜索不同文档中的字段(subjectId
,marksotained
)
尝试使用$elemMatch
运算符匹配同一文档中的两个字段
db.getCollection('test_attempts').updateMany({
subjects: {
$elemMatch: {
subjectId: ObjectId("3"),
marksObtained: { $lt:90 }
}
}
},
{
$inc: {
"subjects.$.rank": 1
}
});