详解MongoDB for C#基础入门
笔者这里采用的是mongodb官网推荐使用.net驱动:
有关于mongodb的安装读者可以参考其他的博客,对于基本的学习来说并不需要进行过多的配置。
创建连接
这一步骤跟ado.net连接到数据库的步骤是一样的,ado.net是利用sqlconnection连接数据库,而mongodb则使用mongoclient连接,并在构造函数中将连接字符传递进去,当然可以不传递,那么默认就是连接本地的计算机的默认端口(27017),比如下面的三种连接方式:
var client = new mongoclient(); var client1 = new mongoclient("mongodb://localhost:27017"); 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;
到此为止,mongodb的基础部分就结束了。希望对大家的学习有所帮助,也希望大家多多支持。