首页 > 解决方案 > 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 仅用于代表性目的。

标签: node.jsmongodbmongoose

解决方案


"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
  }
});

推荐阅读