一、准备工作
1、VisualStudio并创建一个新控制台项目作为演示项目。
2、nuget获取MongoDB.Driver驱动,该驱动依赖于MongoDB.Bson和MongoDB.Driver.Core两个组件。MongoDB.Bson是一个独立的bson库,它处理领域对象类型(poco)到BSON类型的转换。BSON主要被用作MongoDB数据库中的数据存储和网络传输格式。MongoDB.Driver.Core也是一个驱动程序,它具有驱动程序的核心组件,用于从.net到MongoDB的通信。MongoDB.Driver在最顶层,提供异步方法以及支持linq,让开发人员更好的调用Driver.Core中的api。
二、操作数据库
- 连接数据库
var client = new MongoClient(); //默认连接到端口27017上的实例的无参数构造方法 var connectionString = "mongodb://localhost:27017"; var client1 = new MongoClient(connectionString); //接收一个连接字符串的构造方法 var client2 = new MongoClient(new MongoUrl(connectionString));//接受一个MongoUrl的实例 //接受一个MongoClientSettings的实例 var settings= MongoClientSettings.FromConnectionString(connectionString); var client3 = new MongoClient(settings); var settings1 = new MongoClientSettings { Server = new MongoServerAddress("localhost", 27017), }; var client4 = new MongoClient(settings1);
- 获取数据库上下文,如下图,client提供了DropDatabase和GetDatabase方法,这样就可以获取数据库上下文了(IMongoDatabase )
IMongoDatabase db = client.GetDatabase("User");
- 操作数据库 ,IMongoDatabase 接口为我们提供了众多操作数据库的方法,比如创建集合,获取集合对象
static async Task TestAsync() { var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); IMongoDatabase database = client.GetDatabase("School"); IMongoCollection<BsonDocument> collection = database.GetCollection<BsonDocument>("Student"); }
-
文档格式 BsonDocument,BsonDocument是键值对集合,可以往里面添加键值对
var document = new BsonDocument();
document.Add("name","张三");
document.Add("age", "12");
document.Add("sex", "男");
document["address"] = "广东省";
- 插入文本InsertOneAsync,如果数据库、集合不存在,则会自动创建
await collection.InsertOneAsync(document);
- BsonDocument是一种文档存储方式,当然也可以用我们的类属性来作为键值对集合,属性当成键值
var connectionString = "mongodb://localhost:27017"; var client = new MongoClient(connectionString); IMongoDatabase database = client.GetDatabase("School"); IMongoCollection<StudentNew> collection = database.GetCollection<StudentNew>("StudentNew"); IEnumerable<StudentNew> studentNews=new List<StudentNew> { new StudentNew { Name="张三", Age="12", Address=new List<string>{ "广东深圳", "广东广州"}, Sex="男" }, new StudentNew { Name="李四", Age="13", Address=new List<string>{ "湖南长沙", "湖南张家界"}, Sex="男" }, new StudentNew { Name="王五", Age="14", Address=new List<string>{ "江苏南京", "浙江杭州"}, Sex="女" } }; await collection.InsertManyAsync(studentNews); class StudentNew { public string Name { get; set; } public string Age { get; set; } public IEnumerable<string> Address { get; set; } public string Sex { get; set; } }
-
查询数据FindAsync,该方法返回一个批处理IAsyncCursor<bsoncocument>,表示数据将会以分批的形式返回,这样有助于确保单个文档在传输过程中不能使用过多的RAM或过多的带宽。可以在驱动程序中通过设置
FindOptions
的BatchSize来覆盖默认的批大小。默认情况下,服务器将在不活动10分钟后或客户端耗尽游标后自动关闭游标。若要重写此行为,可以指定在查询中使用
FindOptions
类的NoCursorTimeout
属性值设置为false
。但是这样设置必须要手动关闭游标或耗尽游标。 - FindAsync需要传一个过滤器filter,也是个bsondocment。该文档包含对应的过滤键值。
var connectionString = "mongodb://localhost:27017";
var client = new MongoClient(connectionString);
var database = client.GetDatabase("School");
var collection = database.GetCollection<BsonDocument>("StudentNew");
using IAsyncCursor<BsonDocument> cursor = await collection.FindAsync(new BsonDocument());
while (await cursor.MoveNextAsync())
{
IEnumerable<BsonDocument> batch = cursor.Current;
foreach (BsonDocument document in batch)
{
Console.WriteLine(document);
Console.WriteLine();
}
}
class StudentNew
{
public ObjectId _Id { get; set; }
public string Name { get; set; }
public string Age { get; set; }
public IEnumerable<string> Address { get; set; }
public string Sex { get; set; }
}
- 上面是while循环游标的方式遍历集合,也可以用linq式处理返回的数据集合
await collection.FindSync(filter).ToListAsync(); await collection.FindSync(filter).ForEachAsync(doc => Console.WriteLine()); await collection.FindSync(filter).FirstOrDefaultAsync();
-
使用FilterDefinitionBuilder 链式编程
var filter = new FilterDefinitionBuilder<BsonDocument>().Lt("Age", 14); //小于比较 var filter = new FilterDefinitionBuilder<Student>().Lt( student => student.Age, 14); //小于比较
- 可以使用静态
Builders
类来构建过滤器定义,该类还具有用于构建其他内容的静态帮助方法。
var filter = Builders<BsonDocument>.Filter.Lt("Age", 20); var filter = Builders<Student>.Filter.Lt(student=> student.Age, 20);
- 驱动程序还为过滤器定义重载了3个操作符。这个
and (&)
,or (|)
和not (!)
操作。
var builder = Builders<BsonDocument>.Filter; var filter = builder.Eq("Age", 20) & builder.Eq("Name", "张三");
- LINQ表达式构建一个查询过滤器
await collection.Find(student=> student.Age== 14 && student.Sex== "男").ForEachAsync(doc => Console.WriteLine(doc));