Mongodb 如何使用 C# 驱动程序更新许多文档

Posted

技术标签:

【中文标题】Mongodb 如何使用 C# 驱动程序更新许多文档【英文标题】:Mongodb How to Update many documents using C# driver 【发布时间】:2021-11-02 18:59:43 【问题描述】:

请热心帮忙。

我从 xml 解析服务获得了文档列表,并尝试在 DB 中更新它。

我创建了更合适的构建器。

var filter = Builders<T>.Filter.In("Id", List<T>);

并像更新构建器一样。

var update = Builders<T>.Update.Set("T.Property", List<T> )

并使用 UpdateManyAsync() 更新数据库中的文档,但更改不适用。

如何一步一步更新文档?

【问题讨论】:

【参考方案1】:

您好,这是一个使用 .NET core 3.1 控制台应用程序的示例。

这是csproj 文件:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp3.1</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="MongoDB.Driver" Version="2.13.1" />
  </ItemGroup>

</Project>

这是Program.cs文件中的代码:

using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

namespace MongoUpdateMany

  public static class Program
  
    public static async Task Main(string[] args)
    
      const string databaseName = "test";
      const string collectionName = "students";

      var client = new MongoClient();
      var database = client.GetDatabase(databaseName);
      var collection = database.GetCollection<Student>(collectionName);

      // just to be sure the test data are clean, nothing to do with the update sample
      await database.DropCollectionAsync(collectionName).ConfigureAwait(false);

      // create a bunch of students
      var id = 1;

      var enrico = new Student()
      
        Name = "Enrico",
        Id = id++,
        IsActive = false
      ;
      var luca = new Student
      
        Name = "Luca",
        Id = id++,
        IsActive = false
      ;
      var giulia = new Student
      
        Name = "Giulia",
        Id = id++,
        IsActive = true
      ;

      // fill the collection
      await collection.InsertManyAsync(new List<Student>  enrico, giulia, luca ).ConfigureAwait(false);

      // update many
      var ids = new List<int>  enrico.Id, luca.Id ;

      var filter = Builders<Student>
        .Filter
        .In(x => x.Id, ids);

      var update = Builders<Student>
        .Update
        .Set(x => x.IsActive, true);

      await collection.UpdateManyAsync(filter, update).ConfigureAwait(false);

      // verify updating the docs worked
      await collection
        .Find(student => ids.Contains(student.Id))
        .ForEachAsync(student => Console.WriteLine($"Name: student.Name IsActive: student.IsActive"))
        .ConfigureAwait(false);

      Console.WriteLine();
      Console.WriteLine("Press enter to close...");
      Console.ReadLine();
    
  

  public class Student
  
    [BsonId]
    public int Id  get; set; 
    public string Name  get; set; 
    public bool IsActive  get; set; 
  

这里有一些有用的链接来学习如何使用mongodb的官方C#驱动:

driver documentation free course from the Mongo university。 我强烈建议您参加此课程:Mongo 大学目录中提供的课程质量非常高。

【讨论】:

感谢您的回答,因为我知道我不能在过滤器中使用对象列表并且必须创建 id 列表?主要是我的问题是用不同的值更新每个文档,而不是所有文档的 1 个值。 @Nevega 您需要创建一个列表,列出您用于文档 ID 的任何数据类型。在我的示例中,我使用了整数,但这不是强制性的。如果您使用字符串属性作为对象 ID,那么您将拥有一个字符串列表。相反,如果您使用具有 ObjectId 数据类型的字段作为文档 ID,则必须定义 ObjectId 列表。 @Nevega 还注意到 UpdateMany 运算符旨在对过滤器文档匹配的所有文档应用相同的更新操作,该过滤器文档用作 UpdataMany 本身的参数。因此,如果您不想对所有匹配的文档应用相同的更新操作,那么 UpdatyMany 不适合您。可能在您的情况下,您应该使用 UpdateOne 并一次更新一个文档

以上是关于Mongodb 如何使用 C# 驱动程序更新许多文档的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 C# 驱动程序在 MongoDB 中更新和更新多个文档

如何使用官方 c# 驱动程序在 MongoDB 中使用 Update.Set 更新多个字段?

如何使用 C# mongodb 驱动程序防止 SQL 注入?

我如何更新许多 mongodb

如何在 MongoDB C# 驱动程序版本 2 中使用 $ 位置运算符

如何在 MongoDB C# 驱动程序版本 2 中使用 $ 位置运算符