c# MongoDB Driver 官方教程翻译

先贴官方文档地址:http://mongodb.github.io/mongo-csharp-driver/html

安装部分很简单,nuget搜索并安装 MongoDB.Drivergit

 

MongoDB Driver快速浏览

这是MongoDB驱动程序快速浏览的第一部分。在这一部分中,咱们将看看如何执行基本的CRUD(建立,读取,更新,删除)操做。接下来的部分,咱们将看看执行一些管理功能。github

 

注意
有关如何安装MongoDB驱动程序的说明,请参阅 安装指南

 

创建链接

如下示例显示了链接到本地计算机上的一个或多个服务器的三种方法。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类的一个实例。数据库

 

重要

一般,您只能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#对象(PO​​CO)。有关更多信息,请参阅映射文档

 

插入文件

一旦拥有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);

 

 

注意

.NET驱动程序是彻底异步的。有关异步和等待的更多信息,请参阅MSDN文档

全部的API均可用于同步和异步版本。

 

插入多个文档

要插入多个文档,可使用InsertManyor 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个,加上第一个文档),咱们能够检查是否所有使用Countor CountAsync方法。如下代码应该将count的值设置为101。

var count = collection.Count(new BsonDocument());
var count = await collection.CountAsync(new BsonDocument());

 

 

注意

方法的空BsonDocument参数CountAsync是一个过滤器。在这种状况下,它是一个空过滤器,指示对全部文档进行计数。

 

查询集合

使用该Find方法查询集合。Find方法返回一个IFindFluent<TDocument, TProjection>实例,为连接查找操做选项提供流畅的接口。

查找集合中的第一个文档

要获取集合中的第一个文档,请调用FirstOrDefaultor 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 } 
}
 

 

注意
“  id”元素已被MongoDB自动添加到您的文档中,您的值将与所示值不一样。MongoDB保留以“  ”和“$” 开头的字段名称供内部使用。

 

查找集合中的全部文档

要检索集合中的全部文档,请调用ToListor 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),请使用UpdateOneor UpdateOneAsync方法指定过滤器和更新文档。在这里,咱们更新符合过滤器的第一个文档i == 10并将值设置i110

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);

 

要更新与过滤器匹配的全部文档,请使用UpdateManyUpdateManyAsync方法。在这里,咱们增长的价值i100地方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)使用DeleteOneDeleteOneAsync方法:

var filter = Builders<BsonDocument>.Filter.Eq("i", 110);
collection.DeleteOne(filter);
await collection.DeleteOneAsync(filter);

 

要删除与过滤器匹配的全部文档,请使用DeleteManyDeleteManyAsync方法。这里咱们删除全部文件,其中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提供有关操做的信息,包括删除的文档数量。

批量写入

有两种类型的批量操做:

  1. 有序批量操做。

    按顺序执行全部操做,并在第一个错误中执行错误。

  2. 无序批量操做。

    执行全部操做并报告任何错误。无序批量操做不保证执行顺序。

让咱们看看使用有序和无序操做的两个简单例子:

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 });
 

 

重要
链接到2.6以前的MongoDB服务器时,不建议使用bulkWrite方法,由于这是第一个支持用于插入,更新和删除的批量写入命令的第一个服务器版本,容许驱动程序为BulkWriteResult实现正确的语义和BulkWriteException。这些方法仍然适用于2.6之前的服务器,但性能会受到影响,由于每次写入操做必须一次执行一次。
 
 
 其余像建立、删除数据库,建立删除索引等,请继续阅读官方文档,若是不习惯英文可活用chrome浏览器的谷歌翻译功能。
相关文章
相关标签/搜索