mongodb - 使用 golang 的 MongoDB upsert 数组文档
问题描述
我有一个文件如下:</p>
{
"_id": "1.0",
files: [
{"name": "file_1", "size": 1024, "create_ts": 1570862776426},
{"name": "file_2", "size": 2048, "create_ts": 1570862778426}
]
}
而我想用“file_x”更新“files”: 1 如果“file_x”已经在“files”中,则更新,例如“file_x”是:</p>
{"name": "file_2", "size": 4096, "create_ts": 1570862779426}
upsert文件后是:</p>
{
"_id": "1.0",
files: [
{"name": "file_1", "size": 1024, "create_ts": 1570862776426},
{"name": "file_2", "size": 4096, "create_ts": 1570862779426}}
]
}
2 如果“file_x”不在“files”中,则插入,例如“file_x”为:</p>
{"name": "file_3", "size": 4096, "create_ts": 1570862779426}
在 upsert 文件之后是:
{
"_id": "1.0",
files: [
{"name": "file_1", "size": 1024, "create_ts": 1570862776426},
{"name": "file_2", "size": 2048, "create_ts": 1570862778426},
{"name": "file_3", "size": 4096, "create_ts": 1570862779426}
]
}
那么我可以使用一个功能来存档它吗?
解决方案
您将需要手动执行此操作。文档中的嵌入式结构没有 upsert 机制。
首先获取文档,检查是否file_x
在文件列表中,如果没有,插入它。然后将文档保存回来。
您应该确保在任何给定时间,只有一个程序/goroutine 正在尝试执行此操作,否则您将遇到竞争条件并file_x
可能被多次插入。
推荐阅读
- python - 无法将文件写入本地主机和网络共享
- c# - 无法从 Visual Studio 2019 中的解决方案资源管理器中删除文件
- python - 从内存中永久删除精灵 Pygame
- json - JSON Schema 是否支持深度对象验证?
- amazon-web-services - 无法让 Mosquitto <-> AWS IoT -bridge 保持连接
- javascript - Formik - 状态和初始值被覆盖
- android - 错误:命令失败:./gradlew app:installDebug -PreactNativeDevServerPort=8081
- smartcontracts - 为什么像 signer_account_id 这样的环境变量会导致错误:ProhibitedInView?
- jquery - jQuery 日期选择器。我如何从 Jquery datepicker 中获取年份
- r - 在 R 中使用 get() 的问题 - 找不到对象(可能与环境有关?)