首页 > 解决方案 > 如何更新 mongoDB 集合中嵌入文档的记录?

问题描述

我有一个 mongoDB“评级”集合,其中包含以下数据

/* 1 */
{
  "_id": ObjectId("5f1e13936d702dc8b1aa47c8"),
  "ratings": [{
      "music": "PN1",
      "rating": "23"
    },
    {
      "music": "PN2",
      "rating": "24"
    }
  ],
  "email": "test1@mail.com",
  "username": "test1"
}

/* 2 */
{
  "_id": ObjectId("5f1e13f46d702dc8b1aa47c9"),
  "ratings": [{
      "music": "PN3",
      "rating": "45"
    },
    {
      "music": "PN4",
      "rating": "65"
    }
  ],
  "email": "test2@mail.com",
  "username": "test2"
}

我想修改用户名“test1”的 PN1 等级,并执行以下代码

db.getCollection('ratings').update(
    // query 
    {
      "_id": ObjectId("5f1e13936d702dc8b1aa47c8"),
      "email": "test1@mail.com"
    },

    // update 
    {
      "ratings.rating": "8"
    },

    // options 
    {
      "multi": false,
      "upsert": false
    );

该代码有效,但不是仅修改 test1 用户的 PN1 评级,而是将该用户的整个评级列表替换为更新。我怎样才能解决这个问题?我只想修改 test1 用户的 PN1 等级

标签: mongodbmongoose

解决方案


首先,您需要指定要更新数组的哪个元素,例如一个music值为PN1. 您可以通过向与该字段匹配的查询添加一个字段来执行此操作,ratings.music如下所示:

{
  "_id": ObjectId("5f1e13936d702dc8b1aa47c8"),
  "email": "test1@mail.com",
  "ratings.music": "PN1"
}

现在您匹配了要更新的文档,您需要告诉 MongoDB 如何更新文档。更改评级的更新文档可能如下所示:

{
  $set:
        {
          "ratings.$.rating": 8
        }
}

这通过使用$位置运算符来工作,它将更新ratings数组中具有music等于的字段的第一个元素PN1


推荐阅读