zoukankan      html  css  js  c++  java
  • mongodb c#语法基础

    这里采用的是mongoDB官网推荐使用.net驱动:

    http://mongodb.github.io/mongo-csharp-driver/2.0/getting_started/quick_tour/

    有关于MongoDB的安装读者可以参考其他的博客,对于基本的学习来说并不需要进行过多的配置。

     

    创建连接

    这一步骤跟ADO.NET连接到数据库的步骤是一样的,ADO.NET是利用SqlConnection连接数据库,而MongoDB则使用MongoClient连接,并在构造函数中将连接字符传递进去,当然可以不传递,那么默认就是连接本地的计算机的默认端口(27017),比如下面的三种连接方式:


    1 var client = new MongoClient();
    2
    3 var client1 = new MongoClient("mongodb://localhost:27017");
    4
    5 var client2 = new MongoClient("mongodb://localhost:27017,localhost:27018,localhost:27019");

     

     

    获取数据库

    为了获取数据库,只需要调用MongoClient对象的GetDatabase方法,并传入数据库名称即可,如果数据库存在则直接返回,否则就创建该数据库并返回,比如下面的这段代码将创建名为“foo”的数据库:

    var database = client.GetDatabase("foo");
    现在database变量就指向了foo数据库了。

     

    获取链表

    虽然叫获取链表,但是实际上就是获取数据库中的表,我们可以通过上面database的GetCollection<TDocument>方法获取,比如下面的代码我们将获取一个名为“bar”的表:

    var collection = database.GetCollection<BsonDocument>("bar");
    我们传入的泛型参数为BsonDocument,这个是自带的,可以动态的容纳各种格式的数据,当然这里还是建议读者使用POCO。

     

    插入一个文档

    利用collection对象,我们可以将文档插入其中,比如下面的json格式数据:


    {
         "name": "MongoDB",
         "type": "database",
         "count": 1,
         "info": {
             x: 203,
             y: 102
         }
    }

    下面我们利用BsonDocument对象组织上面的JSON格式的数据:


    var document = new BsonDocument
    {
        {"name","MongoDB"},
        {"type","Database"},
       {"count",1},
       {"info",new BsonDocument{
             {"x",203},
             {"y",102}
           }
       }
    };

    然后我们利用collection对象的InsertOneAsync将上面的数据插入其中:

    collection.InsertOneAsync(doc);
    我们都知道Async为后缀的方法都是支持异步的,但是笔者是在控制台项目中演示的所以没有加上这个await,如果读者实在其他的环境中测试的可以根据情况加上。

     

    插入多个文档

    如果需要一次性插入多个文档,我们可以通过InsertManyAsync方法,比如下面的示例我们将插入100条数据:

    var documents = Enumerable.Range(0, 100).Select(x => new BsonDocument("counter", x));
    collection.InsertManyAsync(documents);
     

     

    统计文档数量

    通过上面的步骤我们已经插入了101条数据,如果在实际开发中我们需要统计数据的数量就可以通过调用CountAsync方法,比如下面的代码:

    var count = collection.CountAsync(new BsonDocument());
    Console.WriteLine(count.Result);
     

     

    查询链表

    利用Find方法我们可以对链表进行查询,Find方法将返回给我们IFindFluent<TDocument,TProjection>对象,该接口属于链式接口,所以能够提供给我们类似jquery那样的链式变成方式去控制查询操作。

     

    查询链表首条数据

    为了获取第一条数据我们可以通过调用FirstOrDefaultAsync方法,该方法会返回第一条数据,如果不存在数据则会返回null,比如下面的代码将会显示链表中的第一条数据:

    var firstDoc = collection.Find(new BsonDocument()).FirstOrDefaultAsync();
    Console.WriteLine(firstDoc.Result.ToString());
    如果读者注意最后的输出,会发现一个_id字段,但是我们并没有插入这个字段,这个字段是mongoDB自动加入的,相信很多人都知道它的作用,这里就不详细解释额。

     

    查询链表中所有数据

    如果想将链表中所有的数据都返回可以在Find操作之后调用ToListAsync方法就可以,将会直接返回List<T>类型的结果,比如下面的这段代码:

    var documents = collection.Find(new BsonDocument()).ToListAsync().Result;
    针对数量较少的数据情况下,上面这种方式是没有问题,但如果我们需要处理大量的数据,那么我们就不能使用上面的这种方式,就需要利用下面的方式,通过ForEachAsync来完成,因为这个方法会在每条数据返回的时候执行一个回调,从而达到并发处理的目的,比如下面这段代码就演示了如何使用:

    collection.Find(new BsonDocument()).ForEachAsync(x => Console.WriteLine(x));
     

     

    通过条件查询单条数据

    我们可以在调用Find方法的时候传入一个过滤条件,从而在链表中查询我们希望的数据,比如下面这个例子我们将查询字段“counter”的值为71的数据:

    var filter = Builders<BsonDocument>.Filter.Eq("counter", 71);
    var document = collection.Find(filter).FirstAsync().Result;
    Console.WriteLine(document);
    这里我们需要通过Builders的静态对象Filter中的各种条件方法来构造条件,然后在调用Find方法的将其传入即可。

     

    通过条件查询多条数据

    我们也可以获取多条数据,比如下面这个例子,我们将搜索出所有“counter”的值大于50的数据:

    var filter = Builders<BsonDocument>.Filter.Gt("counter", 50);
    var document = collection.Find(filter).ForEachAsync(x => Console.WriteLine(x));
     

    当然我们也可以给定一个范围,比如50到70之间:

    var filterBuilder = Builders<BsonDocument>.Filter;
    var filter = filterBuilder.Gt("counter", 50) & filterBuilder.Lt("counter", 70);
    collection.Find(filter).ForEachAsync(x => Console.WriteLine(x));
     

     

    对数据排序

    下面我们将在查询的基础之上加上排序,排序只需要在在调用Sort方法时传入对应的参数即可,比如下面的例子,我们将对链表先进行查询,然后排序:

    var filter = Builders<BsonDocument>.Filter.Exists("counter");
    var sort = Builders<BsonDocument>.Sort.Descending("counter");
    var documnt = collection.Find(filter).Sort(sort).FirstAsync().Result;
     

     

    对字段投射

    许多时候我们并不需要文档中的所有数据,这就好比在SQL中我们都会只把我们需要的数据select出来,而不会把表中的所有字段的数据都拿出来,自然MongoDB也可以让我这样做,我们只需要跟过滤和排序一样利用Projection构造器来构造然后传递给Project方法中就可以了,下面这个例子中我们将排除“_id”字段:

    var projection = Builders<BsonDocument>.Projection.Exclude("_id");
    var document = collection.Find(new BsonDocument()).Project(projection).FirstAsync().Result;
    Console.WriteLine(document);
     

     

    更新文档

    MongoDB拥有很多更新操作,下面我们将会介绍几个简单的并且常用的更新操作。

     

    如果我们需要更新一个对象(如果条件不匹配那么可能是0条),可以使用UpdateOneAsync方法,并执行过滤条件和需要更新到的文档,比如下面我们将“counter”为1的数据中的“counter”更新为110:

    var filter = Builders<BsonDocument>.Filter.Eq("counter", 1);
    var updated = Builders<BsonDocument>.Update.Set("counter", 110);
    var result = collection.UpdateOneAsync(filter, updated).Result;
     

    如果我们需要批量的更新,我们可以调用UpdateManyAsync即可。比如我们需要将“counter”小于10的数据中的“counter”累加100,那么我们就可以像下面这样来写:

    var filter = Builders<BsonDocument>.Filter.Lt("counter", 10);
    var updated = Builders<BsonDocument>.Update.Inc("counter", 100);
    var result = collection.UpdateManyAsync(filter, updated).Result;
     

     

    删除文档

    作为基础部分这也是最后一个部分了,利用上面的过滤,然后调用DeleteOneAsync或DeleteManyAsync方法就可以了,比如下面的列子就是删除“counter”大于100的所有数据:

    var filter = Builders<BsonDocument>.Filter.Gt("counter", 100);
    var resut = collection.DeleteManyAsync(filter).Result;

  • 相关阅读:
    linux查看CPU和内存信息
    linux yum命令详解
    查看文件中关键字前后几行的内容
    vue.js+web storm安装及第一个vue.js
    android GPS: code should explicitly check to see if permission is available
    ASP.NET MVC Identity 使用自己的SQL Server数据库
    阿里云服务器,tomcat启动,一直卡在At least one JAR was scanned for TLDs yet contained no TLDs就不动了
    ASP.NET MVC4 MVC 当前上下文中不存在名称“Scripts”
    python 将windows字体中的汉字生成图片的方法
    Java android DES+Base64加密解密
  • 原文地址:https://www.cnblogs.com/klsw/p/5599155.html
Copyright © 2011-2022 走看看