mongodb - 如何更新 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 等级
解决方案
首先,您需要指定要更新数组的哪个元素,例如一个music
值为PN1
. 您可以通过向与该字段匹配的查询添加一个字段来执行此操作,ratings.music
如下所示:
{
"_id": ObjectId("5f1e13936d702dc8b1aa47c8"),
"email": "test1@mail.com",
"ratings.music": "PN1"
}
现在您匹配了要更新的文档,您需要告诉 MongoDB 如何更新文档。更改评级的更新文档可能如下所示:
{
$set:
{
"ratings.$.rating": 8
}
}
这通过使用$位置运算符来工作,它将更新ratings
数组中具有music
等于的字段的第一个元素PN1
。
推荐阅读
- c++ - 如何在 C++ 中正确使用 ifstreams、子进程并避免泄漏?
- c++ - 你什么时候会使用函数重载而不是默认参数?
- php - 用于匹配 HTML 字符串的正则表达式
- swift - 路由时如何在请求中传递参数(使用 Vapor 的服务器端 Swift)
- java - 如何停止输出空变量?
- android - Android后台任务和电池消耗
- python - python请求和无javascript浏览器请求之间的区别?
- google-app-engine - 使用 Google App Engine 设置暂存环境
- python - 椭圆曲线点乘法有时会产生错误的结果
- java - Android studio:CutomListView 给出了奇怪的输出,它应该给出 firebase 数据。有什么解决办法吗?