* 0、MongoClient 类
* 这个类是操控MongoDB服务器的根对象。与服务器的连接是自动在后台处理的 (用了一个连接池来提升效率).
当连接到一个副本是,用的仍然只有一个MongoClient的实例,它代表一个完整的副本。驱动会自动找出所有副本里的成员并识别出当前的主服务器。
这个类的实例是线程安全的。
操作默认情况下,除非设置了,否则,所有的操作需要WriteConcern使用W = 1。换句话说,默认情况下,所有的写操作都会阻塞,直到服务器已经确认。
连接字符串的格式:mongodb://[username:password@]hostname[:port][/[database][?options]]
[username:password@] 用户评价的账号密码 , 只有在MongoDB服务器使用了身份验证时才出现 非必须
hostname[:port] 主机和端口 默认为 27017 要连接多个服务器的话,用逗号分隔多个主机名(和端口号,如果有的话。mongodb://server1,server2:27017,server2:27018 必须
* [/[database][?options]] 库和额外操作,可选的模式有:自动 automatic (默认), 直接 direct, 副本replica set, 和 分片路由 shardrouter。 非必须
* 说明:如果在创建连接的时候指定了凭据,那它就是默认凭据。所有的库都使用该凭据在访问时。在此基础上也可以之后为单独的库指定访问凭据
* 一、 MongoServer 类:
1、 要从MongoClient获取MongoServer 实例可以使用GetServer方法
2、从 MongoServer 实例取得 MongoDatabase 实例可以使用 GetDatabase 方法,由五种重载,
MongoCredentials为数据库访问的身份认证凭据;
大多数的数据设置都是从服务器对象继承来的, GetDatabase 提供的重载可以对经常使用的设置进行覆盖。
要覆盖其它设置,调用 CreateDatabaseSettings 并在调用 GetDatabase 之前更改任何你想要的设置
MongoDatabase GetDatabase(string databaseName)
MongoDatabase GetDatabase(string databaseName, MongoCredentials credentials)
MongoDatabase GetDatabase(string databaseName, MongoCredentials credentials, WriteConcern writeConcern)
MongoDatabase GetDatabase(string databaseName, WriteConcern writeConcern)
MongoDatabase GetDatabase(MongoDatabaseSettings settings)
3、 RequestStart/RequestDone 方法
有时候为了保证结果正确,需要在同一个连接里执行一系列操作。这比较少见,而且大多数时候没有必要去调用 RequestStart/RequestDone。有必要这么做的一个例子是在w=0的WriteConcern的快速会话中调用了一系列的Insert,然后紧接着马上查询出这些数据来(在w=0的WriteConcern下,服务器里的写操作会排队,而且可能不会马上对其它连接可见)。使用 RequestStart 可以在同一个连接里在写的时候强制查询,因此查询直到服务器捕获了写操作之后才会执行。
通过使用RequestStart 和 RequestDone,线程可以从连接池里暂时保留一个连接,例如:
using(server.RequestStart(database)) {
// 在同一个连接里需要执行一系列操作
}
database 参数只是简单地说明你要在这个请求期间要用哪些数据库。这使服务器能够对已经身份验证通过的数据库拿来就用 (如果没用身份验证那这个优化就没关系了)。在这个请求期间你可以任意地使用其它数据库了。
RequestStart (为这个线程)增加了一个计数,在完成后再减掉。保留的连接实际不是返回到连接池里,直到计数再次变为0。这说明嵌套调用 RequestStart 是没有问题的。
RequestStart 返回了一个 IDisposable。如果是在using块里用 RequestStart ,为了释放连接最好尽快调用 RequestDone 。
二、 MongoDatabase 类:
线程安全的 这个类表示 MongoDB 服务器的数据库。通常每个数据库只有一个实例,除非你是用不同的设置来访问同一个数据库,这样就是每个设置都有一个实例。
1、GetCollection 此方法返回一个表示数据库里集合的对象。当请求一个集合对象时,要同时制定集合的默认文档类型。
GetCollection 维系了之前返回过的一个实例表,因此如果以同样的参数再次调用 GetCollection 会得到同一个实例。
GetCollection 提供的重载可以对常用的设置进行覆盖。要覆盖其它的设置,调用 CreateCollectionSettings 并在调用 GetCollection 之前更改任何你想要的设置
三、MongoCollection<TDefaultDocument> 类 此类表示 MongoDB 数据库里的集合。 <TDefaultDocument> 泛型参数指定了此集合默认文档的类型。
* 1、Insert<TDocument> 方法 要在集合里插入一个文档,创建一个表示该文档的对象并调用 Insert。对象可以是BsonDocument 的实例或者是可以成功序列化为BSON文档的任何类的实例
2、InsertBatch 一次性插入多个文档 插入多个文档时,使用 InsertBatch 比 Insert 效率更高
* 3、Find 和 FindAs 方法通过接受一个查询,告诉服务器要返回那个文档,query 参数是 IMongoQuery 类型的
* 4、Save<TDocument> 方法
Save 方法是 Insert 和 Update的组合。如果文档的 Id 有值,那么就假定这是一个已经存在的文档,Save就会在文档上
调用Update(设置Upsert标记以防止它实际上是个新文档)。否则就假定这是一个新文档,Save会在首先将新生成的唯一值设到Id上,然后调用Insert。
5、Update
6、FindAndModify 当你想要查找一个文档并在一个原子操作里更新它时,就使用 FindAndModify。 FindAndModify 只更新一个文档,配合使用具有排序标准的多文档查询来确定到底要更新哪个文档。另外, FindAndModify 会返回符合条件的文档 (不管是在更新前还是更新后) 而且可以指定要返回文档的那些字段。
* 7、MapReduce 方法Map/Reduce 是从集合里汇总数据的一种方法。集合里的每一个文档(或者某些子集,如果可选查询提供了的话)都被传到map函数,该函数调用emit来产生中间值。然后中间值被传到reduce函数进行汇总。
* 四、IMongoQuery 接口标记了类可以用来进行查询。构建查询的最常用方法是要么使用Query建造类,
要么自己创建一个QueryDocument (QueryDocument 是BsonDocument 的子类,同时实现了 IMongoQuery 因此可以用作查询对象)。
同时,通过使用 QueryWrapper 类,查询可以是任何能序列化为BSON文档的类型,不过这取决于你得保证序列化后的文档表示的是一个
有效的查询对象。
* 五、WriteConcern 类
* WriteConcern 有好几级,这个类就是用来表示这些级次的。 WriteConcern 只是应用在那些没有返回值的操作 (所以它不应用在查询和命令中)。它应用于这几个 MongoCollection 方法: Insert, Remove, Save 和 Update.
WriteConcern 的要领是在 Insert, Remove, Save 或者 Update之后,紧接着调用GetLastError命令将消息发送到服务器,这样驱动就可以操作成功了。另外,当使用副本时,有可能确认信息被复制到最少量的辅服务器上去。
class Program
{
//Mongo数据库
public static MongoDatabase database;
static void Main(string[] args)
{
new Program().GetData();
}
public void GetData()
{
//创建数据库链接 相当于1、2步
//MongoServer server1 = MongoDB.Driver.MongoServer.Create("mongodb://127.0.0.1:27017");
MongoClient client = new MongoClient("mongodb://127.0.0.1:27017");
MongoServer server = client.GetServer();
/*获取库的方式*/
//1、获取order数据库 不需要或采用默认的身份认证凭据
MongoDatabase orderdatabase = server.GetDatabase("order");
//2、获取user数据库 需要身份认证凭据
MongoCredentials credentials = new MongoCredentials("username", "password");//身份验证
MongoDatabase userdatabase = server.GetDatabase("user", credentials);
/*3、replica set 中的secondary 节点默认是不可读的。在写多读少的应用中,使用Replica Sets来实现读写分离。通过在连接时指定或者在主库指定slaveOk,由Secondary来分担读的压力,Primary只承担写操作。
GetDatabase 维系了一个 MongoDatabase 之前返回过的 实例表,因此如果以同样的参数再次调用 GetDatabase 会再次得到相同的实例
*/
var databasesetting = server.CreateDatabaseSettings("product");
databasesetting.SlaveOk = true;
var prodatabase = server.GetDatabase(databasesetting);
/*获取指定库的指定集合*/
MongoCollection o_AmountCollection=orderdatabase.GetCollection<Users>("Amount");
//2、 GetCollection 提供的重载可以对常用的设置进行覆盖。要覆盖其它的设置,调用 CreateCollectionSettings 并在调用 GetCollection 之前更改任何你想要的设置
var collectionSettings= prodatabase.CreateCollectionSettings<Users>("Amount");
collectionSettings.SlaveOk = true;
MongoCollection pro_AmountCollection = prodatabase.GetCollection(collectionSettings);
/*往指定库的指定集合添加指定数据*/
MongoCollection o_AmountCollectionInsert = orderdatabase.GetCollection<Users>("Amount");
Users user = new Users() { Name = "权威指南", Sex = "男" };
WriteConcernResult result=o_AmountCollectionInsert.Insert(user);
//在我们不知道对象类型的情况下可以使用BsonDocument
MongoCollection o_AmountCollectionInsertBeson = orderdatabase.GetCollection<BsonDocument>("Amount");
BsonDocument beson = new BsonDocument {
{"Name","farmkwork"},{"Sex","女"}
};
WriteConcernResult result2=o_AmountCollectionInsert.Insert(beson);
//插入嵌套Beson文档
MongoCollection o_ProductCollectionInsertBeson = prodatabase.GetCollection<BsonDocument>("product");
BsonDocument besoning = new BsonDocument {
{"proname","红富士"},
{"address",new BsonDocument{{"country","中国"},{"city","上海"}}}
};
WriteConcernResult result4 = o_ProductCollectionInsertBeson.Insert(besoning);
//一次插入多条记录 插入多个文档时,使用 InsertBatch 比 Insert 效率更高。
MongoCollection o_AmountCollectionInsertBesons = orderdatabase.GetCollection<BsonDocument>("Amount");
BsonDocument[] besons = {
new BsonDocument{{"Name","farmkwork"},{"Sex","女"}},
new BsonDocument{{"Name","farmkwork2"},{"Sex","男"}}
};
List<WriteConcernResult> results = o_AmountCollectionInsert.InsertBatch(besons).ToList();
/*查询数据并筛选*/
//1、创建一个QueryDocument查询,使用query建造类构造查询
MongoCollection o_AmountCollectionquery = orderdatabase.GetCollection<BsonDocument>("Amount");
var querydoc=new QueryDocument("Name","farmkwork");
foreach (BsonDocument b in o_AmountCollectionquery.FindAs(typeof(Users), querydoc))
{
// do something with book
}
//2、需要引入using MongoDB.Driver.Builders; 使用 Query Builder (推荐)
var queryEQ = Query.EQ("Name", "farmkwork");
foreach (BsonDocument b in o_AmountCollectionquery.FindAs(typeof(Users), queryEQ))
{
// do something with book
}
/*修改数据*/
MongoCollection o_AmountCollectionupdate = orderdatabase.GetCollection<BsonDocument>("Amount");
var queryand = Query.And(Query.EQ("Name", "farmkwork"), Query.EQ("Sex", "女"));
//使用save方法 查询一条记录 并修改sex
BsonDocument am = (BsonDocument)o_AmountCollectionupdate.FindOneAs(typeof(Users), queryand);
if (am != null) {
am["Sex"] = "男";
o_AmountCollectionupdate.Save(am);//调用Save方法的时候,TDocument 类必须要有Id。如果没有的话可以调用Insert来插入文档。
}
//使用update方法
UpdateBuilder update= Update.Set("Sex", "不男不女");
//var update2 = new UpdateDocument { { "$set", new BsonDocument("Sex", "不男不女") } };
o_AmountCollectionupdate.Update(queryand, update);
}
}
public class Users
{
//_id 属性必须要有,否则在更新数据时会报错:“Element '_id' does not match any field or property of class”。
public ObjectId _id;//BsonType.ObjectId 这个对应了 MongoDB.Bson.ObjectId
public string Name { get; set; }
public string Sex { get; set; }
}