MongoDB C# Driver 管理快速入门指南

如何在 Windows 上安装 MongoDB
MongoDB C# Driver 快速入门指南

这是 MongoDB 驱动快速入门的第二部分,我们可以看到一些管理层面的方法。在第一部分中,我们介绍了如何执行一些简单的CRUD操作。

Setup

下面的例子,介绍了如何快速创建和链接client databasecollection 变量。

var client = new MongoClient();
var database = client.GetDatabase("foo");
var collection = client.GetCollection<BsonDocument>("bar");

标注:

client 中调用 GetDatabase 方法不会创建相应的数据库,相同的,在 database 中调用 GetCollection 方法也不会创建相应的集合。只有当数据被写入成功的时候,相应的 databasecollection 才会被创建。比如创建索引或将文档插入之前不存在的集合中。

List the Databases

你可以使用 ListDatabases 或者 ListDatabasesAsync 方法获取到所有数据的集合。

using (var cursor = client.ListDatabases())
{
    foreach (var document in cursor.ToEnumerable())
    {
        Console.WriteLine(document.ToString()));
    }
}
using (var cursor = await client.ListDatabasesAsync())
{
    await cursor.ForEachAsync(document => Console.WriteLine(document.ToString()));
}
Drop a Database

你可以使用 DropDatabase 或者 DropDatabaseAsync 方法删除相应的数据库。

client.DropDatabase("foo");
await client.DropDatabaseAsync("foo");
Create a Collection

一个数据库中的集合会被自动创建,直到该集合首次插入一个文档。使用 CreateCollection 或者 CreateCollectionAsync 方法,你可以创建一个指定自定义大小的盖子集合。例如,创建一个1MB大小的盖子集合:

var options = new CreateCollectionOptions { Capped = true, MaxSize = 1024 * 1024 };
database.CreateCollection("cappedBar", options);
await database.CreateCollectionAsync("cappedBar", options);
Drop a Collection

你可以使用 DropCollection 或者 DropCollectionAsync 方法去删除一个集合:

database.DropCollection("cappedBar");
await database.DropCollectionAsync("cappedBar");
Create an Index

MongoDB数据库支持二级索引. 你可以对指定一个字段创建索引,也可以对多个字段结合创建复合索引,并为每个字段指定一个排序方式。1 表示升序,-1 表示降序。下面的例子将为字段 i 创建了一个升序的索引:

collection.Indexes.CreateOne(new BsonDocument("i", 1));
// or
var keys = Builders<BsonDocument>.IndexKeys.Ascending("i");
collection.Indexes.CreateOne(keys);
await collection.Indexes.CreateOneAsync(new BsonDocument("i", 1));
// or
var keys = Builders<BsonDocument>.IndexKeys.Ascending("i");
await collection.Indexes.CreateOneAsync(keys);

更多关于索引字段定义构造器参见 reference section

List the Indexes in a Collection

使用 List 或者 ListAsync 方法列举集合中的索引:

using (var cursor = collection.Indexes.List())
{
    foreach (var document in cursor.ToEnumerable())
    {
        Console.WriteLine(document.ToString());
    }
}
using (var cursor = await collection.Indexes.ListAsync())
{
    await cursor.ForEachAsync(document => Console.WriteLine(document.ToString()));  
}

上面的例子将会打印下面的信息:

{ "v" : 1, "key" : { "_id" : 1 }, "name" : "_id_", "ns" : "mydb.test" }
{ "v" : 1, "key" : { "i" : 1 }, "name" : "i_1", "ns" : "mydb.test" }
Text Indexes

MongoDB 数据库同样支持文本搜索索引。文本索引可以在字段值类型为字符串的字段或者字符串类型数组上创建。下面举例在集合中为“text”字段创建文本索引:

collection.Indexes.CreateOne(new BsonDocument("content", "text"));

// or

var keys = Builders<BsonDocument>.IndexKeys.Text("content");
collection.Indexes.CreateOne(keys);
await collection.Indexes.CreateOneAsync(new BsonDocument("content", "text"));

// or

var keys = Builders<BsonDocument>.IndexKeys.Text("content");
await collection.Indexes.CreateOneAsync(keys);

在MongoDB 2.6中,文本索引现在已经集成到主查询语言中,并且默认启用:

// 插入一些文档
collection.InsertMany(new []
{
    new BsonDocument("_id", 0).Add("content", "textual content"),
    new BsonDocument("_id", 1).Add("content", "additional content"),
    new BsonDocument("_id", 2).Add("content", "irrelevant content"),
});

// 使用文本索引找到它们
var filter = Builders<BsonDocument>.Filter.Text("textual content -irrelevant");
var matchCount = collection.Count(filter);
Console.WriteLine("Text search matches: {0}", matchCount);

// 使用文本索引和$语言操作符找到它们
var englishFilter = Builders<BsonDocument>.Filter.Text("textual content -irrelevant", "english");
var matchCount = collection.Count(filter);
Console.WriteLine("Text search matches (english): {0}", matchCount);

// 找到最高得分的比赛
var projection = Builders<BsonDocument>.Projection.MetaTextScore("score");
var doc = collection.Find(filter).Project(projection).First();
Console.WriteLine("Highest scoring document: {0}", doc);
// 插入一些文档
await collection.InsertManyAsync(new []
{
    new BsonDocument("_id", 0).Add("content", "textual content"),
    new BsonDocument("_id", 1).Add("content", "additional content"),
    new BsonDocument("_id", 2).Add("content", "irrelevant content"),
});

// 使用文本索引找到它们
var filter = Builders<BsonDocument>.Filter.Text("textual content -irrelevant");
var matchCount = await collection.CountAsync(filter);
Console.WriteLine("Text search matches: {0}", matchCount);

// 使用文本索引和$语言操作符找到它们
var englishFilter = Builders<BsonDocument>.Filter.Text("textual content -irrelevant", "english");
var matchCount = await collection.CountAsync(filter);
Console.WriteLine("Text search matches (english): {0}", matchCount);

// 找到最高得分的比赛
var projection = Builders<BsonDocument>.Projection.MetaTextScore("score");
var doc = await collection.Find(filter).Project(projection).FirstAsync();
Console.WriteLine("Highest scoring document: {0}", doc);

以上将会打印出:

Text search matches: 2
Text search matches (english): 2
Highest scoring document: { "_id" : 1, "content" : "additional content", "score" : 0.75 }

想要获取更多关于文本查询的信息,参见 文本索引文本查询操作

Running a Command

不是所有的命令都有明确的帮助器,不过,你可以通过 RunCommand 或者 RunCommandAsync 来执行所有的命令。例如我们可以通过如下的方式:

var buildInfoCommand = new BsonDocument("buildinfo", 1);
var result = database.RunCommand(buildInfoCommand);
var result = await database.RunCommandAsync(buildInfoCommand);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,716评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,558评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,431评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,127评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,511评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,692评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,915评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,664评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,412评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,616评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,105评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,424评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,098评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,096评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,869评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,748评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,641评论 2 271

推荐阅读更多精彩内容