Node.js MongoDB按值更新数组元素匹配

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("

我的数据库包含以下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,并使用匹配的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
  }
});