我有一个包含这样的文档的集合:
{
"_id" : "a7a7d52e-3d9c-98bb-907f-07beaa2e8903",
"code" : "Keywords",
"itemArray" : [
{
"_id" : "26426253-5692-4bf0-a3cf-31876dc49b0a",
"code" : "key1",
"textEnglish" : "key650",
"textFrench" : "key650",
},
{
"_id" : "ef21cfa8-58a4-4466-ab0e-5ef9e27d8223",
"code" : "key2",
"textEnglish" : "key650",
"textFrench" : "key650",
},
{
"_id" : "2ae81850c-baa1-438a-b96f-d555620a8aa4",
"code" : "key3",
"textEnglish" : "key650",
"textFrench" : "key650",
}
]
}
我想根据项目 id 或代码“更新” itemArray 项目(如果没有找到,则将项目插入到数组中)
我没有问题添加如下:
await Collection
.FindOneAndUpdateAsync(x => x.Id == "a7a7d52e-3d9c-98bb-907f-07beaa2e8903"
builder.Push(x => x.ItemArray, item));
或更新现有的
var result = await Collection
.FindOneAndUpdateAsync(x => x.Id == "a7a7d52e-3d9c-98bb-907f-07beaa2e8903" && x.ItemArray.Any(it => it.Id == item.Id || it.Code == item.Code),
builder.Set(x => x.ItemArray[-1], item));
但是,尝试在单个指令中进行 upsert 以避免并发问题。我尝试了一些选项(例如 SetOnInsert),但没有任何效果。
更新现有数组项(基于某些标准)或插入(如果在单个 api 调用中没有原子地找到)的最佳方法是什么?(更新)