<五>.nercore 使用MongoDB 基本操作

一、准备工作

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

 

posted @ 2022-06-16 22:34  许轩霖  阅读(132)  评论(0编辑  收藏  举报