先贴官方文档地址:http://mongodb.github.io/mongo-csharp-driver/html
安装部分很简单,nuget搜索并安装 MongoDB.Drivergit
这是MongoDB驱动程序快速浏览的第一部分。在这一部分中,咱们将看看如何执行基本的CRUD(建立,读取,更新,删除)操做。在接下来的部分,咱们将看看执行一些管理功能。github
如下示例显示了链接到本地计算机上的一个或多个服务器的三种方法。mongodb
// To directly connect to a single MongoDB server // (this will not auto-discover the primary even if it's a member of a replica set) var client = new MongoClient(); // or use a connection string var client = new MongoClient("mongodb://localhost:27017"); // or, to connect to a replica set, with auto-discovery of the primary, supply a seed list of members var client = new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019");
该client
实例如今拥有一个到链接字符串中指定的服务器或服务器的链接池。chrome
该MongoClient
实例实际上表明了一个到数据库的链接池; 即便有多个线程,您也只须要MongoClient类的一个实例。数据库
一般,您只能MongoClient
为给定群集建立一个实例,并在整个应用程序中使用它。MongoClients
可是,只有在链接字符串相同的状况下,建立多个意志仍将共享相同的链接池。api
要获取数据库,请在上面的GetDatabase
方法中指定数据库的名称client
。若是数据库尚不存在,那也没问题。它将在第一次使用时建立。浏览器
var database = client.GetDatabase("foo");
该database
变量如今拥有对“foo”数据库的引用。服务器
要获取集合以进行操做,请将集合的名称指定给该GetCollection<TDocument>
方法database
。若是该集合尚不存在,那也不要紧。它将在第一次使用时建立。app
var collection = database.GetCollection<BsonDocument>("bar");
该collection
变量如今拥有对“foo”数据库中“bar”集合的引用。
泛型参数TDocument
表示集合中存在的模式。上面,咱们用a BsonDocument
来表示咱们没有预约义的模式。也可使用普通的C#对象(POCO)。有关更多信息,请参阅映射文档。
一旦拥有collection
实例,就能够将文档插入到集合中。例如,请考虑如下JSON文档; 该文档包含一个嵌入式文档的字段信息:
{ "name": "MongoDB", "type": "database", "count": 1, "info": { x: 203, y: 102 } }
要使用.NET驱动程序建立文档,请使用BsonDocument
该类。您也可使用此类建立嵌入文档。
var document = new BsonDocument { { "name", "MongoDB" }, { "type", "Database" }, { "count", 1 }, { "info", new BsonDocument { { "x", 203 }, { "y", 102 } }} };
要将文档插入到集合中,请使用InsertOne 或者
InsertOneAsync
方法。
collection.InsertOne(document); await collection.InsertOneAsync(document);
要插入多个文档,可使用InsertMany
or InsertManyAsync
方法。
// generate 100 documents with a counter ranging from 0 - 99 var documents = Enumerable.Range(0, 100).Select(i => new BsonDocument("counter", i)); collection.InsertMany(documents); await collection.InsertManyAsync(documents);
如今咱们已经插入了101个文档(咱们在循环中加入了100个,加上第一个文档),咱们能够检查是否所有使用Count
or CountAsync
方法。如下代码应该将count的值设置为101。
var count = collection.Count(new BsonDocument()); var count = await collection.CountAsync(new BsonDocument());
该方法的空BsonDocument
参数CountAsync
是一个过滤器。在这种状况下,它是一个空过滤器,指示对全部文档进行计数。
使用该Find
方法查询集合。该Find
方法返回一个IFindFluent<TDocument, TProjection>
实例,为连接查找操做选项提供流畅的接口。
要获取集合中的第一个文档,请调用FirstOrDefault
or FirstOrDefaultAsync
方法。FirstOrDefault
返回第一个文档或null。这对仅适用于单个文档的查询或仅对第一个文档感兴趣的查询颇有用。
如下示例打印集合中找到的第一个文档。
var document = collection.Find(new BsonDocument()).FirstOrDefault(); Console.WriteLine(document.ToString()); var document = await collection.Find(new BsonDocument()).FirstOrDefaultAsync(); Console.WriteLine(document.ToString());
该示例应打印如下文档:
{ "_id": ObjectId("551582c558c7b4fbacf16735") }, "name": "MongoDB", "type": "database", "count": 1, "info": { "x" : 203, "y" : 102 } }
要检索集合中的全部文档,请调用ToList
or ToListAsync
方法。这在预计要返回的文档数量很小时颇有用。
var documents = collection.Find(new BsonDocument()).ToList(); var documents = await collection.Find(new BsonDocument()).ToListAsync();
若是文档数量预计很大或者能够迭代处理,那么ForEachAsync
将为每一个返回的文档调用回调。
await collection.Find(new BsonDocument()).ForEachAsync(d => Console.WriteLine(d));
要使用同步API遍历返回的文档,请使用带ToEnumerable
适配器方法的C#foreach语句:
var cursor = collection.Find(new BsonDocument()).ToCursor(); foreach (var document in cursor.ToEnumerable()) { Console.WriteLine(document); }
上面的每一个例子都会向控制台输出彻底相同的东西。有关迭代的更多信息,请参阅参考文档。
咱们能够建立一个过滤器来传递给Find
方法,以获取咱们的集合中的文档的子集。例如,若是咱们想要查找“i”字段的值为71的文档,咱们将执行如下操做:
var filter = Builders<BsonDocument>.Filter.Eq("i", 71); var document = collection.Find(filter).First(); Console.WriteLine(document); var document = await collection.Find(filter).FirstAsync(); Console.WriteLine(document); 它应该只打印一个文件: { "_id" : ObjectId("5515836e58c7b4fbc756320b"), "i" : 71 }
咱们还能够从咱们的收藏中得到一组文档。例如,若是咱们想要获取全部文档i > 50
,咱们能够这样写:
var filter = Builders<BsonDocument>.Filter.Gt("i", 50); var cursor = collection.Find(filter).ToCursor(); foreach (var document in cursor.ToEnumerable()) { Console.WriteLine(document); } await collection.Find(filter).ForEachAsync(document => Console.WriteLine(document));
咱们也能够获得一个范围,说50 < i <= 100
:
var filterBuilder = Builders<BsonDocument>.Filter; var filter = filterBuilder.Gt("i", 50) & filterBuilder.Lte("i", 100); var cursor = collection.Find(filter).ToCursor(); foreach (var document in cursor.ToEnumerable()) { Console.WriteLine(document); } await collection.Find(filter).ForEachAsync(document => Console.WriteLine(document));
咱们经过调用Sort
方法为查询查询添加一个排序。下面咱们使用Exists
过滤器构建器方法和Descending
排序构建器方法对咱们的文档进行排序:
var filter = Builders<BsonDocument>.Filter.Exists("i"); var sort = Builders<BsonDocument>.Sort.Descending("i"); var document = collection.Find(filter).Sort(sort).First(); var document = await collection.Find(filter).Sort(sort).FirstAsync();
不少时候,咱们不须要文档中包含的全部数据。“ 投影”构建器将帮助为查找操做构建投影参数。下面咱们将排除“_id”字段并输出第一个匹配文档:
var projection = Builders<BsonDocument>.Projection.Exclude("_id"); var document = collection.Find(new BsonDocument()).Project(projection).First(); Console.WriteLine(document.ToString()); var document = await collection.Find(new BsonDocument()).Project(projection).FirstAsync(); Console.WriteLine(document.ToString());
MongoDB支持许多更新运算符。
要最多更新1个文档(若是没有匹配过滤器,则可能为0),请使用UpdateOne
or UpdateOneAsync
方法指定过滤器和更新文档。在这里,咱们更新符合过滤器的第一个文档i == 10
并将值设置i
为110
:
var filter = Builders<BsonDocument>.Filter.Eq("i", 10); var update = Builders<BsonDocument>.Update.Set("i", 110); collection.UpdateOne(filter, update); await collection.UpdateOneAsync(filter, update);
要更新与过滤器匹配的全部文档,请使用UpdateMany
或UpdateManyAsync
方法。在这里,咱们增长的价值i
由100
地方i < 100
。
var filter = Builders<BsonDocument>.Filter.Lt("i", 100); var update = Builders<BsonDocument>.Update.Inc("i", 100); var result = collection.UpdateOne(filter, update); if (result.IsModifiedCountAvailable) { Console.WriteLine(result.ModifiedCount); } var result = await collection.UpdateManyAsync(filter, update); if (result.IsModifiedCountAvailable) { Console.WriteLine(result.ModifiedCount); }
更新方法返回一个UpdateResult
提供有关操做的信息,包括更新修改的文档数量。
要删除最多1个文档(若是没有匹配过滤器,则能够为0)使用DeleteOne
或DeleteOneAsync
方法:
var filter = Builders<BsonDocument>.Filter.Eq("i", 110); collection.DeleteOne(filter); await collection.DeleteOneAsync(filter);
要删除与过滤器匹配的全部文档,请使用DeleteMany
或DeleteManyAsync
方法。这里咱们删除全部文件,其中i >= 100
:
var filter = Builders<BsonDocument>.Filter.Gte("i", 100); var result = collection.DeleteMany(filter); Console.WriteLine(result.DeletedCount); var result = await collection.DeleteManyAsync(filter); Console.WriteLine(result.DeletedCount);
删除方法返回一个DeleteResult
提供有关操做的信息,包括删除的文档数量。
有两种类型的批量操做:
有序批量操做。
按顺序执行全部操做,并在第一个错误中执行错误。
无序批量操做。
执行全部操做并报告任何错误。无序批量操做不保证执行顺序。
让咱们看看使用有序和无序操做的两个简单例子:
var models = new WriteModel<BsonDocument>[] { new InsertOneModel<BsonDocument>(new BsonDocument("_id", 4)), new InsertOneModel<BsonDocument>(new BsonDocument("_id", 5)), new InsertOneModel<BsonDocument>(new BsonDocument("_id", 6)), new UpdateOneModel<BsonDocument>( new BsonDocument("_id", 1), new BsonDocument("$set", new BsonDocument("x", 2))), new DeleteOneModel<BsonDocument>(new BsonDocument("_id", 3)), new ReplaceOneModel<BsonDocument>( new BsonDocument("_id", 3), new BsonDocument("_id", 3).Add("x", 4)) }; // 1. Ordered bulk operation - order of operation is guaranteed collection.BulkWrite(models); // 2. Unordered bulk operation - no guarantee of order of operation collection.BulkWrite(models, new BulkWriteOptions { IsOrdered = false }); // 1. Ordered bulk operation - order of operation is guaranteed await collection.BulkWriteAsync(models); // 2. Unordered bulk operation - no guarantee of order of operation await collection.BulkWriteAsync(models, new BulkWriteOptions { IsOrdered = false });