C# MongoDb - 如何更新嵌套文档中的一个字段?

标签 c# mongodb mongodb.driver

我想要实现的是提供List<JobList>包含作业的客户端 ID 和内部 ID Finish()方法。 然后我想迭代客户端并更新所有匹配 JobInternalIds 的作业并将当前日期时间设置为 FinishedAt 字段。 问题是我完全不知道如何更新嵌套对象。

我尝试过类似下面的方法,但没有成功。

public class Client
{
    [BsonId]
    public ObjectId Id { get; set;}
    public string Name { get; set;}
    public List<Job> Jobs { get; set;}
}

public class Job
{
    public string InternalId { get; set;}
    public string Name { get; set;}
    public DateTime? FinishedAt { get; set;}
}

public class JobList
{
    public string ClientId { get; set; }
    List<string> JobInternalIds { get; set; }
}

public async Task Finish(List<JobList> joblist)
{   
    var updateDefinition = new UpdateDefinitionBuilder<Client>()
        .Set(x => x.Job[0].FinishedAt, DateTime.UtcNow); // don't know how to set datetime to finishedAt for each elements of collection that matches InternalIds

    foreach(var item in joblist)
    {
        await _db.Collection.UpdateManyAsync(item.ClientId, updateDefinition);
    }   
}

----------EDITED----------
public async Task Finish(List<JobList> joblist)
{
    var updateDefinition = Builders<Client>.Update
        .Set(x => x.Jobs[-1].FinishedAt, DateTime.UtcNow);

    foreach (var item in joblist)
    {
        var internalIds = item.JobInternalIds.Select(x => x.InternalId).ToList();   
        var idFilter = Builders<Client>.Filter.Eq(x => x.Id, item.ClientId);
        var internalIdsFilter = Builders<Client>.Filter.ElemMatch(x => x.Jobs, y => internalIds.Contains(y.InternalId));
        var combinedFilters = Builders<Client>.Filter.And(idFilter, internalIdsFilter);

        await _db.Collection.UpdateManyAsync(combinedFilters, updateDefinition);
    }
}

最佳答案

您可以使用过滤位置运算符来更新数组中与条件匹配的所有元素:

var internalIds = new[] { "1", "2" };
var idFilter = Builders<Client>.Filter.Eq(x => x.Id, objectId);
var updateDefinition = Builders<Client>.Update
    .Set("Jobs.$[job].FinishedAt", DateTime.UtcNow);

await collection.UpdateManyAsync(idFilter, updateDefinition,
     new UpdateOptions
     {
         ArrayFilters = new []
         {
             new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("job.groupName", new BsonDocument("$in", new BsonArray(internalIds)))),
         }
     });

查看此博客文章中的一些示例 - https://kevsoft.net/2020/03/23/updating-arrays-in-mongodb-with-csharp.html

关于C# MongoDb - 如何更新嵌套文档中的一个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60743714/

相关文章:

c# - C# 中的多个 MongoDb 过滤器

c# - 将 BsonDocument 映射到类但出现错误

c# - 如何从 C# 中具有重复元素名称的 Mongodb 读取数据

c# - 如何使用 Automapper 完成以下映射?

c# - 根据 web.config 检查 sqlce 数据库是否存在

c# - Visual C# - 根据用户角色将用户重定向到不同的窗体

mongodb - 如何删除数组中的一项

javascript - MongoDB 中 .eval 的智能替代方案

c# - 一种情况下多次按键

arrays - 如何编写查询对象内部数组的mongo查询?