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 注入?