MongoDB C# 驱动教程.docx
- 文档编号:30221351
- 上传时间:2023-08-07
- 格式:DOCX
- 页数:30
- 大小:33.31KB
MongoDB C# 驱动教程.docx
《MongoDB C# 驱动教程.docx》由会员分享,可在线阅读,更多相关《MongoDB C# 驱动教程.docx(30页珍藏版)》请在冰豆网上搜索。
MongoDBC#驱动教程
MongoDBC#驱动教程
C#驱动版本v1.6.x
本教程基于C#驱动v1.6.x。
Api文档见此处:
http:
//api.mongodb.org/csharp/current/ .
本教程介绍由10gen支持的,用于MongoDB的C#驱动。
C#驱动由两个类库组成:
BSONLibrary和C#Driver。
BSONLibrary可以独立于C#Driver使用。
C#Driver则必须需要BSONLibrary。
你还可能对 C#驱动序列化教程 感兴趣。
它是一个另外的教程因为它涵盖了很多资料。
C#驱动既有源代码也有二进制文件。
BSONLibrary和C#Driver都存在同一个知识库里,而BSONLibrary可以独立使用。
原文件可以从 进行下载。
我们使用msysgit作为我们的Windowsgit客户端。
可以到这里进行下载:
.
要复制知识库的话,从gitbashshell里运行以下命令:
$cd
$gitconfig--globalcore.autocrlftrue
$gitclonegit:
//
$cdmongo-csharp-driver
$gitconfigcore.autocrlftrue
复制知识库之前,必须将core.autocrlf的全局设置设为true。
当复制完毕后,我们建议你将core.autocrlf的本地设置设为true(如上所示),这样将来core.autocrlf的全局设置更改了也不会影响到这个知识库。
如果你到时候想把全局设置的core.autocrlf改为false,则运行:
$gitconfig--globalcore.autocrlffalse
core.autocrlf设置的典型问题是git报告整个文件都被修改了(由于行结尾的差异)。
在知识库创建后更改core.autocrlf的设置是相当没劲的,所以在开始时就设好它是很重要的。
你可以通过点击以下链接的Downloads按钮来下载源文件的zip文件(不用复制知识库):
你可以在以下链接下载二进制文件(.msi和.zip两种格式):
目前我们使用VisualStudio2010来生成C#驱动。
解决方案的名称是 CSharpDriver-2010.sln .
单元测试依赖NUnit2.5.9,它已包含在知识库的依赖项文件夹中。
你可以不用安装NUnit就生成C#驱动,不过要运行单元测试则必须安装NUnit(除非你用别的测试运行器)
有三个工程包含单元测试:
1.BsonUnitTests
2.DriverUnitTests
3.DriverUnitTestsVB
BsonUnitTests不连接MongoDB服务端。
DriverUnitTests和DriverUnitTestsVB连接一个运行在localhost上默认端口的MongoDB实例。
运行单元测试的一个简单方法是将其中一个单元测试工程设为启动项目并遵照以下说明配置工程(用BsonUnitTests做例子):
∙在”调试“页签里:
1.将”启动操作“设为”启动外部程序“
2.将外部程序设为:
C:
\ProgramFiles(x86)\NUnit2.5.9\bin\net-2.0\nunit.exe
3.将“命令行参数”设为:
BsonUnitTests.csproj/config:
Debug/run
4.将“工作目录”设为:
BsonUnitTest.csproj所在的目录
如果还想为单元测试运行在Release模式的话,为Release配置重复以上步骤(使用/config:
Release代替)。
nunit.exe的实际路径可能根据你的机器有轻微不同。
要运行DriverUnitTests和DriverUnitTestsVB执行相同的步骤(如有必要适当修改).
如果你想安装C#驱动到你的机器上,你可以用安装程序(见上面的下载说明)。
安装程序很简单,只需把DLL复制到指定安装目录即可。
如果你下载了二进制zip文件,只需简单地解压文件并把它们放到任意地方。
注意:
如果你下载的是.zip文件,Windows可能要你"解除锁定"帮助文件。
当你双击 CSharpDriverDocs.chm文件时, 如果Windows问你"是否要打开此文件?
",将“每次打开此文件时都询问”旁的复选框勾掉,然后再点击“打开”按钮。
或者还可以在CSharpDriverDocs.chm文件上右键,选择“属性”,然后在“常规”页签的顶部点击“解除锁定”按钮。
如果“解除锁定”按钮没显示的话,就没必要解除锁定了。
要使用C#驱动,需要添加以下DLL引用:
1.MongoDB.Bson.dll
2.MongoDB.Driver.dll
至少要在你的源文件里加上以下using语句:
usingMongoDB.Bson;
usingMongoDB.Driver;
另外还可能经常用到以下using语句:
usingMongoDB.Driver.Builders;
usingMongoDB.Driver.GridFS;
usingMongoDB.Driver.Linq;
在某些情况下如果你要使用C#驱动的某些可选部分的话,还可能用上以下某些using语句:
usingMongoDB.Bson.IO;
usingMongoDB.Bson.Serialization;
usingMongoDB.Bson.Serialization.Attributes;
usingMongoDB.Bson.Serialization.Conventions;
usingMongoDB.Bson.Serialization.IdGenerators;
usingMongoDB.Bson.Serialization.Options;
usingMongoDB.Bson.Serialization.Serializers;
usingMongoDB.Driver.Wrappers;
C#驱动在BSONLibrary之上创建的。
BSONLibrary处理BSON格式的所有细节,包括:
I/O,序列化以及BSON文档的内存中对象模型。
BSON对象模型的重要类有:
BsonType,BsonValue,BsonElement,BsonDocument和BsonArray.
这个枚举用来指定BSON值得类型,定义为:
publicenumBsonType{
Double=0x01,
String=0x02,
Document=0x03,
Array=0x04,
Binary=0x05,
Undefined=0x06,
ObjectId=0x07,
Boolean=0x08,
DateTime=0x09,
Null=0x0a,
RegularExpression=0x0b,
JavaScript=0x0d,
Symbol=0x0e,
JavaScriptWithScope=0x0f,
Int32=0x10,
Timestamp=0x11,
Int64=0x12,
MinKey=0xff,
MaxKey=0x7f
}
BsonValue是一个抽象类,表示一个BSON类型的值。
BsonType枚举中定义的每一个值都对应了一个具体的BsonValue子类。
要获取一个BsonValue实例有几种方法:
∙使用一个BsonValue的子类的公共构造函数(如果有的话)
∙使用BsonValue的静态Create方法
∙使用BsonValue的子类的静态Create方法
∙使用BsonValue的子类的静态属性
∙使用隐式转换到BsonValue
使用静态Create方法的好处是它们可以为经常使用的值返回预创建实例。
它们还可以返回null(构造函数却不能),当使用函数式构造创建BsonDocument处理可选元素时将很有用。
静态属性引用经常使用的值的预创建实例。
隐式转换允许你使用原生的.NET值,不管BsonValue是否需要,而且.NET值会自动转换为BsonValue。
BsonValue有一个名为BsonType的属性,可以用来查询BsonValue的实际类型。
以下例子演示判断BsonValue类型的几种方法:
BsonValuevalue;
if(value.BsonType==BsonType.Int32){
//知道值是BsonInt32的实例
}
if(valueisBsonInt32){
//另一种知道值是BsonInt32的方法
}
if(value.IsInt32){
//最简单的知道值是BsonInt32的方法
}
BsonValue有大量将BsonValue投射(cast)成它的子类或原生.NET类型的属性。
注意很重要的一点是,这些属性都只是投射(cast),而不是转换(conversion)。
如果BsonValue不是对应的类型的话,将抛出一个InvalidCastException异常。
参见To[Type]方法,它进行的就是转换操作,以及Is[Type]属性,你可以在尝试使用其中一个As[Type]属性前用它查询BsonValue的类型。
BsonDocumentdocument;
stringname=document["name"].AsString;
intage=document["age"].AsInt32;
BsonDocumentaddress=document["address"].AsBsonDocument;
stringzip=address["zip"].AsString;
BsonValue有以下布尔属性,用来测试它是什么类型的BsonValue。
这些可以如下使用:
BsonDocumentdocument;
intage=-1;
if(document.Contains["age"]&&document["age"].IsInt32){
age=document["age"].AsInt32;
}
不像As[Type]方法,To[Type]方法在可转换类型间,如int和double,执行同样的有限转换。
ToBoolean 方法从不失败。
它使用JavaScript的似真非真定义:
false,0,0.0,NaN,BsonNull,BsonUndefined和""都是false,而其余的都是true(包括字符串"false").
ToBoolean 方法当处理的文档可能对记录true/false值时有不确定方法时就显得特别有用:
if(employee["ismanager"].ToBoolean()){
//weknowtheemployeeisamanager
//workswithmanywaysofrecordingbooleanvalues
}
ToDouble , ToInt32 ,和 ToInt64 方法当在数字类型间转换时从不失败,但是值如果不适合目标类型的话可能会被截断。
字符串可以转换为数字类型,但如果字符串不能解析为目标类型的值的话将抛出异常。
由于BsonValue是一个抽象类,你不能创建BsonValue的实例(只能创建具体子类的实例)。
BsonValue有一个静态 Create 方法,参数只有一个,是object类型的,并在运行时确定要创建的BsonValue的实际类型。
BsonValue的子类也有静态的Create方法,由它们的需求而定制。
隐式转换是从以下.NET类型到BsonValue定义的:
∙bool
∙byte[]
∙DateTime
∙double
∙Enum
∙Guid
∙int
∙long
∙ObjectId
∙Regex
∙string
这就不用再调用BsonValue构造函数或者Create方法了。
例如:
BsonValueb=true;//b是一个BsonBoolean的实例
BsonValued=3.14159;//d是一个BsonDouble的实例
BsonValuei=1;//i是一个BsonInt32的实例
BsonValues="Hello";//s是一个BsonString的实例
这几个类都是单例的,所以每个类只有一个实例存在。
要引用这些实例,使用每个类的静态Value属性:
document["status"]=BsonNull.Value;
document["priority"]=BsonMaxKey.Value;
注意C#的null和BsonNull.Value是两个不同的东西。
后者其实是一个C#对象,表示一个BSONnull值(这是很细微的区别,但在功能结构里却扮演很重要的角色).
ObjectId是一个结构体,维持一个BSONObjectId的原始值。
BsonObjectId是BsonValue的一个子类,其Value属性是ObjectId类型。
这里是一些创建ObjectId值的常用方法:
varid1=newObjectId();//和ObjectId.Empty一样
varid2=ObjectId.Empty;//全是0
varid3=ObjectId.GenerateNewId();//生成新的唯一Id
varid4=ObjectId.Parse("4dad901291c2949e7a5b6aa8");//解析24位十六进制数字串
注意第一个例子C#与JavaScript有不同的表现。
在C#里它创建了一个全是0的ObjectId,不过在JavaScript里它生成一个新的唯一Id。
这个差异无法避免,因为在C#里值类型的构造函数总是把值初始化为全0。
BsonElement是一个键值对,值是一个BsonValue。
它好比BsonDocument的积木,由0或者更多的元素组成。
一般很少直接创建BsonElements,因为它们通常是不需要直接创建的。
例如:
document.Add(newBsonElement("age",21));//没问题,但下一行更简短
document.Add("age",21);//自动创建BsonElement
BsonDocument是键值对 (BsonElement) 的集合。
它是BSON文档的内存中对象模型。
有三种方法创建并填充BsonDocument:
1.创建一个新的文档并调用Add和Set方法
2.创建一个新的文档并连续调用Add和Set方法
3.创建一个新的文档并使用C#的集合初始化语法(推荐)
BsonDocument有以下构造函数:
∙BsonDocument()
∙BsonDocument(stringname,BsonValuevalue)
∙BsonDocument(BsonElementelement)
∙BsonDocument(Dictionary
∙BsonDocument(Dictionary
∙BsonDocument(IDictionarydictionary)
∙BsonDocument(IDictionarydictionary,IEnumerable
∙BsonDocument(IDictionary
∙BsonDocument(IDictionary
∙BsonDocument(IEnumerabe
∙BsonDocument(paramsBsonElement[]elements)
∙BsonDocument(boolallowDuplicateNames)
前两个是最可能用到的。
第一个创建一个空的文档,第二个以一个元素创建文档(这两种情况当然都可以添加更多元素)。
所有构造函数(除了那个有 allowDuplicateNames参数的之外 )都简单地调用了同参数的Add方法,所以参考相应的Add方法以了解新文档是如何初始化填充的。
BsonDocument一般不允许有重复的名称,但如果你想有重复的名称的话,就调用带allowDuplicateNames参数的构造函数并传入true。
不建议你使用重复的名称,此选项只是为了处理已有的可能存在重复名称的BSON文档。
MongoDB不保证是否支持带重复名称的文档,所以发送此类文档到服务器是务必小心。
这是传统的用多行C#语句一步步创建并填充文档的方法。
例如:
BsonDocumentbook=newBsonDocument();
book.Add("author","ErnestHemingway");
book.Add("title","ForWhomtheBellTolls");
这个和前一个方法很类似,不过连续调用Add方法只需一行C#语句即可。
例如:
BsonDocumentbook=newBsonDocument()
.Add("author","ErnestHemingway")
.Add("title","ForWhomtheBellTolls");
这是在一行语句中创建和初始化BsonDocument的推荐方法。
它使用C#集合初始化语法:
BsonDocumentbook=newBsonDocument{
{"author","ErnestHemingway"},
{"title","ForWhomtheBellTolls"}
};
编译器将这行代码翻译为与之匹配的Add方法:
BsonDocumentbook=newBsonDocument();
book.Add("author","ErnestHemingway");
book.Add("title","ForWhomtheBellTolls");
常见的错误时忘了写里面的花括弧。
这会导致一个编译错误。
例如:
BsonDocumentbad=newBsonDocument{
"author","ErnestHemingway"
};
会被编译器翻译成:
BsonDocumentbad=newBsonDocument();
bad.Add("author");
bad.Add("ErnestHemingway");
会导致编译错误因为没有Add方法是只接受一个string参数的。
嵌套BSON文档通过设置元素的值为BSON文档来进行创建。
例如:
BsonDocumentnested=newBsonDocument{
{"name","JohnDoe"},
{"address",newBsonDocument{
{"street","123MainSt."},
{"city","Centerville"},
{"state","PA"},
{"zip",12345}
}}
};
这个创建了一个顶级文档,有两个元素("name"和"address")。
"address"的值是一个嵌套的BSON文档。
BsonDocument有如下重载的Add方法
∙Add(BsonElementelement)
∙Add(Dictionary
∙Add(Dictionary
∙Add(IDictionarydictionary)
∙Add(IDictionarydictionary,IEnumerable
∙Add(IDictionary
∙Add(IDictionary
∙Add(IEnumerable
∙Add(stringname,BsonValuevalue)
∙Add(stringname,BsonValuevalue,boolcondition)
要注意的很重要的一点是有时候Add方法不会添加新元素。
如果提供的值是null(或者最后一个重载中提供的condition是false)的话那元素就不会被添加。
这在处理可选元素时就不用写任何if语句或者条件表达式了。
例如:
BsonDocumentdocument=newBsonDocument{
{"name",name},
{"city",city},//如果city是null就不添加
{"dob",dob,dobAvailable}//如果dobAvailable是false则不添加
};
就比下面更简洁和可读性强:
BsonDocumentdocument=newBsonDocument();
document.Add("name",name);
if(city!
=null){
document.Add("city",city);
}
if(dobAvailable){
document.Add("dob",dob);
}
如果你想在值缺失的情况下添加一个BsonNull,你可能会这么做。
但更简单的方法是使用C#的?
?
运算符:
BsonDocument=n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- MongoDB C# 驱动教程 驱动 教程
![提示](https://static.bdocx.com/images/bang_tan.gif)