Class 存储在 MongoDB (C#) 中,包含内部数组。需要更新嵌套数组中的单个元素,更好的方法是什么?

Class is stored in MongoDB (C#), contains internal arrays. Need to update a single element in the nested array, what is the better way to do that?

.NET 核心项目。我有一个租户 class,其中包含几个嵌套集合(位置、员工等),存储在 MongoDB 中。我正在使用 MongoDB C# 驱动程序。租户存储在 MongoDB.

中的 TenantCollection 中

Task:例如我需要更新一个Employee,它存储在Tenant.Employees列表(附加到Tenant的嵌套数组)中。

BTW - 我的下一个问题是关于“如何将元素插入嵌套数组”,所以请考虑到它,因为我将不得不使用相同的稍后用于数据插入的机制...

问题是 - 什么更好:

  1. 只是从数据库中取出整个租户(包含所有嵌套的 lists/arrays - 这里可能有很多数据),更新员工列表中的单个元素,然后将其放回数据库, 通过使用 _mongoDbCollection.ReplaceOneAsync(x => x.Id = tenant.Id, tenant)
  2. 使用某些 MongoDB 功能并更新嵌套集合中的特定元素?

第 1 点的优点 - 简单,缺点 - 可能有大量数据 - 因为我必须使用 class + 几个内部数组(位置、员工、部门等,但它真的是重要的?)。 第 2 点的可能(!!)优点 - 速度...在这里我们只更新嵌套数组的一个元素。缺点 - 不知道该怎么做,因为我没有 MongoDB...

的经验

什么更好-您怎么看? 如果您更喜欢第 2 点 - 怎么做?

非常感谢!

使用 FindOneAndUpdate 是更好的选择,因为您只想更新文档实体的特定部分。你通过提供一个过滤器(通常是一个 id)来使用它,更新本身。

这是我创建的方法:

        public async Task UpdateNestedElementAsync<TField>(Expression<Func<T, bool>> filter, Expression<Func<TField, bool>> itemFilter, Expression<Func<T, IEnumerable<TField>>> field, IEnumerable<TField> val)
    {
        // step 1 (could be skipped if we want just to add the element - pass itemFilter=NULL) - remove the element from the Collection, but it wasn't tested
        if (itemFilter != null)
        {
            await _collection.FindOneAndUpdateAsync(filter, Builders<T>.Update.PullFilter(field, itemFilter));
        }
        // step 2 - add new or updated element to the Collection (push it there)
        await _collection.FindOneAndUpdateAsync(filter, Builders<T>.Update.PushEach(field, val));
    }

其中 T 是根 class,TField 是嵌套集合。