MongoDB upsert数组文档与golang
我有如下文件:MongoDB upsert数组文档与golang,mongodb,go,Mongodb,Go,我有如下文件: { "_id": "1.0", files: [ {"name": "file_1", "size": 1024, "create_ts": 1570862776426}, {"name": "file_2", "size": 2048, "create_ts": 1570862778426} ] } 我想用“file_x”插入“files”: 1如果“文件”中已有“文件”,则更新,
{
"_id": "1.0",
files: [
{"name": "file_1", "size": 1024, "create_ts": 1570862776426},
{"name": "file_2", "size": 2048, "create_ts": 1570862778426}
]
}
我想用“file_x”插入“files”:
1如果“文件”中已有“文件”,则更新,例如“文件”为:
upsert后的文档是:
{
"_id": "1.0",
files: [
{"name": "file_1", "size": 1024, "create_ts": 1570862776426},
{"name": "file_2", "size": 4096, "create_ts": 1570862779426}}
]
}
2如果“文件”中没有“文件”,请插入它,例如“文件”是:
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}
]
}
所以我可以使用一个函数来存档它吗?在mongodb更新语言中没有一个更新操作可以完成您想要做的事情。您可以通过使用
$addToSet
来接近,如果项目不在一组项目中,它将添加到项目中,但不会根据字段子集的匹配情况更新项目。您最好的选择是在内存写入中执行读更新。您需要手动执行此操作。文档中的嵌入式结构没有upsert机制
首先获取文档,检查文件列表中是否有file_x
,如果没有,则插入它。然后将文档保存回原处
您应该确保在任何给定时间,只有一个程序/goroutine尝试执行此操作,否则您将遇到竞争条件,并且文件\u x
可能会被多次插入 你可能想要阅读,这大大提高了获得有用答案的可能性。你可能会发现这篇优秀的文章也很有帮助——尽管它的标题“苛刻”。请在你的问题中添加一个。
{"name": "file_3", "size": 4096, "create_ts": 1570862779426}
{
"_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}
]
}