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}
    ]
}