1

我有一个包含这样的文档的集合:

{
    "_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 调用中没有原子地找到)的最佳方法是什么?(更新)

4

0 回答 0