mongodb删除数据库可以批量的插入数据吗?

Mongodb亿级数据量的性能测试,分别测试如下几个项目:(所有插入都是单线程进行,所有读取都是多线程进行)1) 普通插入性能 (插入的数据每条大约在1KB左右)2) 批量插入性能 (使用的是官方C#客户端的InsertBatch),这个测的是批量插入性能能有多少提高3) 安全插入功能 (确保插入成功,使用的是SafeMode.True开关),这个测的是安全插入性能会差多少4) 查询一个索引后的数字列,返回10条记录(也就是10KB)的性能,这个测的是索引查询的性能5) 查询两个索引后的数字列,返回10条记录(每条记录只返回20字节左右的2个小字段)的性能,这个测的是返回小数据量以及多一个查询条件对性能的影响6)
查询一个索引后的数字列,按照另一个索引的日期字段排序(索引建立的时候是倒序,排序也是倒序),并且Skip100条记录后返回10条记录的性能,这个测的是Skip和Order对性能的影响7) 查询100条记录(也就是100KB)的性能(没有排序,没有条件),这个测的是大数据量的查询结果对性能的影响8) 统计随着测试的进行,总磁盘占用,索引磁盘占用以及数据磁盘占用的数量并且每一种测试都使用单进程的Mongodb和同一台服务器开三个Mongodb进程作为Sharding(每一个进程大概只能用7GB左右的内存)两种方案其实对于Sharding,虽然是一台机器放3个进程,但是在查询的时候每一个并行进程查询部分数据,再有运行于另外一个机器的mongos来汇总数据,理论上来说在某些情况下性能会有点提高基于以上的种种假设,猜测某些情况性能会下降,某些情况性能会提高,那么来看一下最后的测试结果怎么样?备注:测试的存储服务器是
E5620 @ 2.40GHz,24GB内存,CentOs操作系统,打压机器是E5504 @ 2.0GHz,4GB内存,Windows Server 2003操作系统,两者千兆网卡直连。点击查看大图从这个测试可以看出,对于单进程的方式:1) Mongodb的非安全插入方式,在一开始插入性能是非常高的,但是在达到了两千万条数据之后性能骤减,这个时候恰巧是服务器24G内存基本占满的时候(随着测试的进行mongodb不断占据内存,一直到操作系统的内存全部占满),也就是说Mongodb的内存映射方式,使得数据全部在内存中的时候速度飞快,当部分数据需要换出到磁盘上之后,性能下降很厉害。(这个性能其实也不算太差,因为我们对三个列的数据做了索引,即使在内存满了之后每秒也能插入2MB的数据,在一开始更是每秒插入25MB数据)2)
对于批量插入功能,其实是一次提交一批数据,但是相比一次一条插入性能并没有提高多少,一来是因为网络带宽已经成为了瓶颈,二来我想写锁也会是一个原因。3) 对于安全插入功能,相对来说比较稳定,不会波动很大,我想可能是因为安全插入是确保数据直接持久化到磁盘的,而不是插入内存就完事。4) 对于一列条件的查询,性能一直比较稳定,别小看,每秒能有的查询次数,每次返回10KB,相当于每秒查询80MB数据,而且数据库记录是2亿之后还能维持这个水平,性能惊人。5) 对于二列条件返回小数据的查询,总体上性能会比4)好一点,可能返回的数据量小对性能提高比较大,但是相对来说性能波动也厉害一点,可能多了一个条件就多了一个从磁盘换页的机会。6)
对于一列数据外加Sort和Skip的查询,在数据量大了之后性能明显就变差了(此时是索引数据量超过内存大小的时候,不知道是否有联系),我猜想是Skip比较消耗性能,不过和4)相比性能也不是差距特别大。7) 对于返回大数据的查询,一秒瓶颈也有800次左右,也就是80M数据,这就进一步说明了在有索引的情况下,顺序查询和按条件搜索性能是相差无几的,这个时候是IO和网络的瓶颈。8) 在整个过程中索引占的数据量已经占到了总数据量的相当大比例,在达到1亿4千万数据量的时候,光索引就可以占据整个内存,此时查询性能还是非常高,插入性能也不算太差,mongodb的性能确实很牛。那么在来看看Sharding模式有什么亮点:1)
非安全插入和单进程的配置一样,在内存满了之后性能急剧下降。安全插入性能和单进程相比慢不少,但是非常稳定。2) 对于一个条件和两个条件的查询,性能都比较稳定,但条件查询性能相当于单进程的一半,但是在多条件下有的时候甚至会比单进程高一点。我想这可能是某些时候数据块位于两个Sharding,这样Mongos会并行在两个Sharding查询,然后在把数据进行合并汇总,由于查询返回的数据量小,网络不太可能成为瓶颈了,使得Sharding才有出头的机会。3) 对于Order和Skip的查询,Sharding方式的差距就出来了,我想主要性能损失可能在Order,因为我们并没有按照排序字段作为Sharding的Key,使用的是_id作为Key,这样排序就比较难进行。4)
对于返回大数据量的查询,Sharding方式其实和单进程差距不是很大,我想数据的转发可能是一个性能损耗的原因(虽然mongos位于打压机本机,但是数据始终是转手了一次)。5) 对于磁盘空间的占用,两者其实是差不多的,其中的一些差距可能是因为多个进程都会多分配一点空间,加起来有的时候会比单进程多占用点磁盘(而那些占用比单进程少的地方其实是开始的编码错误,把实际数据大小和磁盘文件占用大小搞错了)。虽然在最后由于时间的关系,没有测到10亿级别的数据量,但是通过这些数据已经可以证明Mongodb的性能是多么强劲了。另外一个原因是,在很多时候可能数据只达到千万我们就会对库进行拆分,不会让一个库的索引非常庞大。在测试的过程中还发现几个问题需要值得注意:1)
在数据量很大的情况下,对服务进行重启,那么服务启动的初始化阶段,虽然可以接受数据的查询和修改,但是此时性能很差,因为mongodb会不断把数据从磁盘换入内存,此时的IO压力非常大。2) 在数据量很大的情况下,如果服务没有正常关闭,那么Mongodb启动修复数据库的时间非常可观,在1.8中退出的-dur貌似可以解决这个问题,我简单测试了一下,开启dur对插入和查询性能影响都不是很大。3) 在使用Sharding的时候,Mongodb时不时会对数据拆分搬迁,这个时候性能下降很厉害,虽然从测试图中看不出(因为我每一次测试都会测试比较多的迭代次数),但是我在实际观察中可以发现,在搬迁数据的时候每秒插入性能可能会低到几百条。4)
对于数据的插入,如果使用多线程并不会带来性能的提高,反而还会下降一点性能(并且可以在http接口上看到,有大量的线程处于等待)。5) 在整个测试过程中,批量插入的时候遇到过几次连接被远程计算机关闭的错误,怀疑是有的时候Mongodb不稳定关闭了连接,或是官方的C#客户端有BUG,但是也仅仅是在数据量特别大的时候遇到几次。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:46424次
积分:1050
积分:1050
排名:第16813名
原创:47篇
转载:68篇
(1)(5)(5)(1)(2)(4)(1)(3)(1)(2)(2)(8)(4)(12)(7)(5)(7)(5)(4)(2)(2)(1)(2)(1)(2)(3)(1)(6)(1)(1)(1)(13)mongodb数据库优化和高级应用
第九章Mongodb数据库 9.1mongodb入门 9.1.1 NoSQL入门 NoSQL 是not only SQL的缩写,它指的非关系型数据库,是以key-value形式存储,和传统数据不一样,比如不遵循sql标准。随着大数据时代的到来,NoSQL有助于解决传统数据库扩展困难,读写慢,成本高,有限
第九章Mongodb数据库
9.1mongodb入门
9.1.1 NoSQL入门
NoSQL 是not only SQL的缩写,它指的非关系型数据库,是以key-value形式存储,和传统数据不一样,比如不遵循sql标准。随着大数据时代的到来,NoSQL有助于解决传统数据库扩展困难,读写慢,成本高,有限的支撑容量问题.因为它在扩展和性能方面做了提升,对于事务性的要求还不能代替传统数据库。目前新浪微博的redis数据库,视觉中国的mongodb都属于NoSQL数据库范畴。
9.1.2认识mongodb
Mongodb是一个介于关系数据库和非关系数据之间的产品,它语法类似javascript语言。数据是键与值的一种组合,格式如{&age&:25}形式,数据以集合存储。目前已超过百家网站使用mongodb。
9.1.3 mongodb的安装
首先到mongodb.org上下载相应版本。
Tar zxvf mongodb-linux-x86-2.2.2.tgz&& //解压
Cd mongodb-linux-x86-2.2.2& //解压完毕后即成为可执行程序
9.1.4 启动mongodb
Mkdir /usr/local/mongodb
Mkdir /usr/local/mongodb/data
Rsync& -auvz /root/mongo-linux-ix86-2.2.0/bin/ /usr/local/mongodb/
Touch /usr/local/mongodb/dblogs
/usr/local/mongodb/bin/mongod& --dbpath=/usr/local/mongodb &logpath=/usr/local/mongodb/dblogs &fork& //启动mongodb
Echo &/usr/local/mongodb/bin/mongod& --dbpath=/usr/local/mongodb &logpath=/usr/local/mongodb/dblogs --fork& &&/etc/rc.local //开机启动
一般使用pkill mongod& //终止进程,避免使用kill -9杀死进程,因为容易造成mongodb死锁。
/usr/local/mongodb/bin/mongo& 进入字符界面
9.1.5mongodb体系结构
Mongodb数据库不同于传统的关系数据结构,它包括文档,集合和数据三级结构组成。物理结构为一个ns文件一些数据库.0和数据库.1组成。Mongodb数据类型,包括null、布尔、数字、字符串、数组以及对象六种数据类型组成。
9.1.6 mongodb基本命令
&Show dbs& //显示所有数据库
&db.dropDatabase();& //删除当前数据库
&use mydb&& //建立新的数据库
&db.user.insert({name:&user1&,age:25}); //插入数据
&db.user.find();& //查看数据
&db.user.drop({name:&user1&}); //删除记录
&db.user.update({_id:1},{name:&user2&});& //修改记录
9.2& mongodb的高级操作
9.2.1 insert的操作
&db.user.save({name:&user2&});& //保存数据
save和insert一般有同样的插入效果。 但是当主键id相同时,save便会只做修改不做插入的操作。
Db.cl.remove();删除所有记录,如果加上记录字段则删除相应字段。
批量插入数据
&Js方式插入数据
9.2.2 find查询的操作
Db.c1.find();查询语句
Find命令也可以指查找指定字段,字段值为1为真显示,为0为假。
条件查询,gt大于,lt小于,e等于,ne不等于,gte大于等于,lte小于等于,用$定义。
Sort用于排序排列,用sort排列,-1位倒叙,1位正序排列
Limit用来控制显示输出个数,skip用来排除前面多少个
in用来进行范围查找
$or或的查询,$nor非,or与in区别是:or可以接不同字段,in需要接同一个字段。
插入数组,用elemMatch查找数组,代替post.title
查询控制两种方法
查询数组记录,必须在第二个字段进行
9.2.3 update更新的操作
Db.collection.update(criteria,objNew,upsert,multi);
Criteria:用于设置查询条件的对象
Objnew:用于设置更新内容
Upsert:如果记录村子啊就更新它,否则新增一记录
Multi:如果多个符合条件的记录,只会更新第一个符合条件的记录
Upsert第三个参数,意思是如果字段不存在则增加该字段
$set可以用于改变源字段值或增加新字段
$inc字段每个年龄增加一岁,inc对字段曾进行增减值的更改
$unset删除字段,当age为真时删除字段
$push增加数组字段
$pop删除上条记录,如为-1则从前数,$pushAll一次插入多条记录
addToSet只能插入不同值记录
$addToSet和$each一起用一次加入多个值
$pull删除数组指定值,$pullAll删除多个指定值
$rename更改字段名
9.2.4 创建capped collection固定集合
固定集合是固定大小的数据存储方式,它速度处理更快
Db.createCollection(c6,{capped:true,size:10000,max:5}); //数据大小10kB,记录5条,填满了则取代前面的记录
Db.runCommand({convertTocapped:&test&,size:10000});
9.2.5 GridFS大存储类型
GridFS是一种大二进制文件,可以存储一些大文件。包含.files元数据对象和.chunks二进制块信息。
加载GridFS数据类型:
Cd /usr/local/mongodb/bin
Tar zcvf mongofiles.tar.gz& mongosniff
./mongofiles put mongofiles.tar.gz
Mongofile是进行文件上传下载的工具,put上传,get下载
9.3mongodb性能管理
性能优化,如同大多数数据库一样索引可以很好地完成优化工作。可以通过explain()查看数据查询记录的次数。
9.3.1mongodb的索引管理
&db.c1.ensureIndex({name:1});& //建立索引
&db.c1.getIndexes();& //查看索引
再执行explain()便可以看到次数变为8-&1
Db.c1.dropIndexes();&& //删除索引
9.3.2profile慢查询
profile是一种慢查询日志功能。可以通过两种方式开启:
启动mongodb是可以加上&profile=级别
使用db.setProfilingLevel(级别,时间); 定义级别
0-:不开启;1-:记录慢查询;2-:记录所有密令
最后通过&db.getProfilingLevel();查看级别
9.3.3mongodb优化方案
首先建立索引可以提高执行效率
其次使用limit();可以减少资源的消耗量
再次capped collection固定空间功能可以提高效率
再次,查询时指定字段而不是所有字段,提高速度
最后使用慢查询功能,优化语句。
9.3.4mongodb性能监控
mongosniff命令可以监控数据库操作历史
Mongostat命令可以查看mongodb实时结果
本文出自 &嘟嘟的成长日记& 博客,请务必保留此出处http://
《相关文章》
本文标题:mongodb数据库优化和高级应用
版权所有:本站作品,允许转载,转载时请以超链接形式标明文章,原始出处,作者信息。否则将追究法律责任
------分隔线----------------------------
本人linux菜鸟,这两天用u盘安装CentOS,在网上查的教程全是原来版本的,都是先单独做...
第九章Mongodb数据库 9.1mongodb入门 9.1.1 NoSQL入门 NoSQL是not only SQL的缩写,它...
LNMP是一个缩写,它指一组通常一起使用来运行动态网站或者服务器的自由软件: Linux+N...
nginx rewrite 伪静态配置参数和使用例子...
HTTP/1.1 405 Method not allowed 的解决方法...
本文介绍的内容适用于nginx服务器,如果需要通过自带防火墙限制请参考iptables防止CC...当前位置:->->文章详细内容在.net中使用mongodb数据库摘要:MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似...
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bjson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
它的特点是高性能、易部署、易使用,存储数据非常方便。主要功能特性有:
面向集合存储,易存储对象类型的数据。
模式自由。
支持动态查询。
支持完全索引,包含内部对象。
支持查询。
支持复制和故障恢复。
使用高效的二进制数据存储,包括大型对象(如视频等)。
自动处理碎片,以支持云计算层次的扩展性
支持RUBY,PYTHON,JAVA,C++,PHP等多种语言。
文件存储格式为BSON(一种JSON的扩展)
可通过网络访问
所谓“面向集合”(Collenction-Orented),意思是数据被分组存储在数据集中,被称为一个集合(Collenction)。每个
集合在数据库中都有一个唯一的标识名,并且可以包含无限数目的文档。集合的概念类似关系型数据库(RDBMS)里的表(table),不同的是它不需要定
义任何模式(schema)。
模式自由(schema-free),意味着对于存储在数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里。
存储在集合中的文档,被存储为键-值对的形式。键用于唯一标识一个文档,为字符串类型,而值则可以是各中复杂的文件类型。我们称这种存储形式为BSON(Binary
Serialized dOcument Format)。
MongoDB服务端可运行在Linux、Windows或OS
X平台,支持32位和64位应用,默认端口为27017。推荐运行在64位平台,因为MongoDB
在32位模式运行时支持的最大文件尺寸为2GB。
MongoDB把数据存储在文件中(默认路径为:/data/db),为提高效率使用内存映射文件进行管理。
以上为随便摘的,其实就是非传统的非关系数据库,现在归到文档型数据库分类之中,注意32位操作系统支持的最大文件为2GB,所以做大文件海量储存的朋友要选择64位的系统安装。开始我们的下载安装之路吧。
MongoDB的官网是:http://www.mongodb.org/
MongoDB最新版本下载在官网的DownLoad菜单下:http://www.mongodb.org/downloads&
本人选择的是Windows 32-bit 1.8.1版本
MongoDB For .net 驱动开发包位于官网的Driver菜单下(含其它语言开发链接):/mongodb/mongo-csharp-driver/downloads
本人操作系统为Windows7 专业版,选择MongoDB版本为Windows 32-bit
1.8.1,开发包为VS2008版本
开始我们的安装过程了
1.解压mongodb-win32-i386-1.8.1.zip ,创建路径C:\Program Files\mongodb
,将解压后的Bin文件Copy to 此文件夹下
2.C:\Program Files\mongodb 下建立Data文件夹 C:\Program
Files\mongodb\data ,然后分别建立db,log两个文件夹,至此mongodb下有以下文件夹
C:\Program Files\mongodb\bin
C:\Program Files\mongodb\data\db
C:\Program Files\mongodb\data\log
在log文件夹下创建一个日志文件MongoDB.log,即C:\Program
Files\mongodb\data\log\MongoDB.log
完成以上工作后,你为奇怪为什么要建立这些文件夹(因为,Mongodb安装需要这些文件夹,默认安装是不用创建,但是文件都为安装到C:\data\下)
3.安装类型
3.1 程序启动方式
&&& 运行cmd.exe 进入DOS命中界面
& cd C:\Program Files\mongodb\bin
& C:\Program Files\mongodb\bin&mongod -dbpath "C:\Program
Files\mongodb\data\db"
执行此命令即将mongodb的数据库文件创建到C:\Program Files\mongodb\data\db
目录,不出意外的会看到命令最后一行sucess的成功提示
此时数据库就已启动,该界面为Mongo的启动程序,关闭后可直接双击bin下的mongod.exe&
(注意是d,这个是启动程序)
启动程序开启后,再运行mongo.exe 程序(注意没有d) ,界面如下
测试数据库操作
&help& (查看相关信息)
&db.foo.insert({a:1})&&&
(往foo表插入a,1字段值,foo表为默认表)
&db.foo.find()&&&&&&&&&&&&&&&
(查看foo表数据)
结果如下:
可以看到插入了3条记录分别人a,cctv,set 。
当mongod.exe被关闭时,mongo.exe
就无法连接到数据库了,因此每次想使用mongodb数据库都要开启mongod.exe程序,所以比较麻烦,接下来我们将
MongoDB安装为windows服务吧
3.2 windows service方式
运行cmd.exe
& cd C:\Program Files\mongodb\bin
& C:\Program Files\mongodb\bin&mongod --dbpath "C:\Program
Files\mongodb\data\db" --logpath "C:\Program
Files\mongodb\data\log\MongoDB.log" --install --serviceName
这里MongoDB.log就是开始建立的日志文件,--serviceName "MongoDB" 服务名为MongoDB
运行命令成功为如下图:
引时服务已经安装成功,运行
&NET START MongoDB&& (开启服务)
&NET&stop MongoDB&& (关闭服务)
& C:\Program Files\mongodb\bin&mongod --dbpath "C:\Program
Files\mongodb\data\db" --logpath "C:\Program
Files\mongodb\data\log\MongoDB.log" --remove --serviceName
"MongoDB"&&&&& (删除,注意不是--install了)
其它命令可查阅help命令或官网说明。
运行bin文件夹下mongo.exe 客户端测试一下吧。测试同3.1相同 。
到此安装就完成了。
本节问题:
为什么要用MongoDB
MongoDB for&.net驱动选择
MongoDB for VS插件介绍
Demo介绍&&&
&一、为什么要用MongoDB
为什么要用MongoDB取代传统关系型数据库?其实不是取代,只是对传统数据库的文档型补充。不是所有的数据都需要二维关系及多表对应的存储和查询,比如:文件的海量存储,只需Key与Value形式的存储及查询,同时这种方式的存储及查询都是高效的,可查看GirdFS,GirdFS是MongoDB的大文件存储系统,比如图片、音频、视频;数据如果不需要实时分析统计(包含读写比高的),也可以使用KV形式存储及查询。MongoDB介于缓存与数据库之间,存取速度逊于缓存但远远高于传统数据库。数据库存储以键值形式,你可能会认为对数据关系的处理及分析挖掘不及传统数据库,理论上是如此,但是MongoDB加入了对LINQ的支持,相信可以弥补其不足之处。做项目要求稳,对于MongoDB的使用我们只是对传统数据库的一个类似二级缓存的补充,cache缓存及Memcached做为一级缓存,MongoDB做为二级缓存对海量大数据的一个缓冲查询,最终才是数据库及物理文件的存储。如果你对数据的分析挖掘统计不是实时的,也可以尝试使用MongoDB直接存取数据,数据后期处理工作可通过MongoDB同步到传统数据库。(以上纯属个人理解)
用MongoDB做海量存储,又出现另一个问题读写频率与扩展?MongoDB可以根据应用程序的需要以两种模式来运行。第一种是“单主”(single
master)模式,只有一台主服务器来处理所有的写操作。读操作能从中分离出去,通过任意数量的从服务器来进行读操作,这有利于提高读的可扩展性(使用场景:Sourceforge)。对于那些写数据量很大或写频率过高,单台主服务器无法处理的应用程序,可以使用MongoDB的自动分片模式。该模式下写操作会自动分配到任意数量的“片”中(一般是一台或一组MongoDB服务器),它们负责这部分数据集的写和读。无论使用哪种模式,MongoDB都会采取“强一致性”方法(你可以把MongoDB看成CAP理论中的C-P系统)。高可用性是通过将数据复制到多个MongoDB节点来实现的,每个节点都能及时成为一个分片的主服务器——MongoDB会自动处理故障转移。这能让你在维持相当高的写可用性的同时,拥有强一致性特性,这对一些用例来说非常重要。而MongoDB的分片支持复制和故障切换:Mongo数据库支持服务器之间的数据复制,支持主-从模式及服务器之间的相互复制。MongoDB的自动分片模块
("mongos"). 自动分片可以用于构建一个大规模的可扩展的数据库集群,这个集群可以并入动态增加的机器。(说细可参照此官方文档)
二、MongoDB for&.net驱动选择
驱动源码地址:/mongodb/mongo-csharp-driver/downloads(第一章提到的)
项目应用:
第一款:mongodb-csharp 项目地址:/samus/mongodb-csharp&&应用很广泛,更新速度也比较快,也加入了对LINQ的支持&
第二款:simple-mongodb 项目地址:&&
以JSON为核心
第三款:NoRM 项目地址:/atheken/NoRM&
加入了对强类型的支持,是对一的补充
其它的也有,就不介绍了,经过综合比较选择了方案一,也就是第一章介绍的。方案一应该广泛用于项目了,并且保持较快的更新速度,同时也加了LINQ的支持,对于项目求稳的朋友是最好的选择,所以我也选择了方案一samus驱动,下载的是(samus-mongodb-csharp-0.90.0.1.zip)下载选Tar.Zip包含源码。另外一个包只有DLL。后面的文章中将一直使用samus开发包。
三、MongoDB for VS插件介绍
插件下载地址:/ILoveSilence/archive//mongowidget_1.html&(园子里人做的)
插件和VS的数据源功能类似,想使用的就去看这篇博文吧。
四、Demo介绍
下载samus开发包后,你会发现里面已经有了samples了,那就开始我们的入门之路了
这Demo都不写了,直接拿来分析了
留意的朋友会发现,MongoDB的连接字符串是IP+端口,与传统的数据库引擎不同,包括数据的CURD操作都是键值方式,是不是有点像Memcached。
using&System.C
using&System.L
using&MongoDB;
using&MongoDB.C
using&MongoDB.L
namespace&Simple
&&&&///&&summary&
&&&&///&&&Illustrates&some&simple&operations&on&the&database.
&&&&///&&&Creating&a&database&connection.
&&&&///&&&Remove&some&documents.
&&&&///&&&Insert&some&documents
&&&&///&&&Find&one&document
&&&&///&&&Find&several&documents&and&iterate&through&them.
&&&&///&&/summary&
&&&&internal&class&MainClass
&&&&&&&&private&IMongoCollection&Document&&
&&&&&&&&private&Mongo&
&&&&&&&&private&IMongoDatabase&
&&&&&&&&private&class&MyClass
&&&&&&&&&&&&public&string&Name&{&&&}
&&&&&&&&&&&&public&&int&Corners&{&&&}
&&&&&&&&private&class&SubClass&:&MyClass
&&&&&&&&&&&&public&double&Ratio&{&&&}
&&&&&&&&public&static&void&Main(string[]&args)
&&&&&&&&&&&&#region&以下为被屏蔽源码部分,我们先从SetUp方法开始
&&&&&&&&&&&&//var&config&=&new&MongoConfigurationBuilder();
&&&&&&&&&&&&////&COMMENT&OUT&FROM&HERE
&&&&&&&&&&&&//config.Mapping(mapping&=&
&&&&&&&&&&&&//{
&&&&&&&&&&&&//&&&&mapping.DefaultProfile(profile&=&
&&&&&&&&&&&&//&&&&{
&&&&&&&&&&&&//&&&&&&&&profile.SubClassesAre(t&=&&t.IsSubclassOf(typeof(MyClass)));
&&&&&&&&&&&&//&&&&});
&&&&&&&&&&&&//&&&&mapping.Map&MyClass&();
&&&&&&&&&&&&//&&&&mapping.Map&SubClass&();
&&&&&&&&&&&&//});
&&&&&&&&&&&&////&TO&HERE
&&&&&&&&&&&&//config.ConnectionString("Server=127.0.0.1");
&&&&&&&&&&&&//using&(Mongo&mongo&=&new&Mongo(config.BuildConfiguration()))
&&&&&&&&&&&&//{
&&&&&&&&&&&&//&&&&mongo.Connect();
&&&&&&&&&&&&//&&&&try
&&&&&&&&&&&&//&&&&{
&&&&&&&&&&&&//&&&&&&&&var&db&=&mongo.GetDatabase("TestDb");
&&&&&&&&&&&&//&&&&&&&&var&collection&=&db.GetCollection&MyClass&();
&&&&&&&&&&&&//&&&&&&&&MyClass&square&=&new&MyClass()
&&&&&&&&&&&&//&&&&&&&&{
&&&&&&&&&&&&//&&&&&&&&&&&&Corners&=&4,
&&&&&&&&&&&&//&&&&&&&&&&&&Name&=&"Square"
&&&&&&&&&&&&//&&&&&&&&};
&&&&&&&&&&&&//&&&&&&&&MyClass&circle&=&new&MyClass()
&&&&&&&&&&&&//&&&&&&&&{
&&&&&&&&&&&&//&&&&&&&&&&&&Corners&=&0,
&&&&&&&&&&&&//&&&&&&&&&&&&Name&=&"Circle"
&&&&&&&&&&&&//&&&&&&&&};
&&&&&&&&&&&&//&&&&&&&&SubClass&sub&=&new&SubClass()
&&&&&&&&&&&&//&&&&&&&&{
&&&&&&&&&&&&//&&&&&&&&&&&&Name&=&"SubClass",
&&&&&&&&&&&&//&&&&&&&&&&&&Corners&=&6,
&&&&&&&&&&&&//&&&&&&&&&&&&Ratio&=&3.43
&&&&&&&&&&&&//&&&&&&&&};
&&&&&&&&&&&&//&&&&&&&&collection.Save(square);
&&&&&&&&&&&&//&&&&&&&&collection.Save(circle);
&&&&&&&&&&&&//&&&&&&&&collection.Save(sub);
&&&&&&&&&&&&//&&&&&&&&var&superclass&=&(from&item&in&db.GetCollection&MyClass&("MyClass").Linq()
&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&&&where&item.Corners&&&1
&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&&&select&item.Corners).ToList();
&&&&&&&&&&&&//&&&&&&&&var&subclass&=&(from&item&in&db.GetCollection&SubClass&("MyClass").Linq()
&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&&&&&&&where&item.Ratio&&&1
&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&&&&&&&select&item.Corners).ToList();
&&&&&&&&&&&&//&&&&&&&&Console.WriteLine("Count&by&LINQ&on&typed&collection:&{0}",&collection.Linq().Count(x&=&&x.Corners&&&1));
&&&&&&&&&&&&//&&&&&&&&Console.WriteLine("Count&by&LINQ&on&typed&collection2:&{0}",&db.GetCollection&SubClass&().Linq().Count(x&=&&x.Corners&&&1));
&&&&&&&&&&&&//&&&&&&&&//Console.WriteLine("Count&by&LINQ&on&typed&collection3:&{0}",&db.GetCollection&SubClass&().Count(new&{&Corners&=&Op.GreaterThan(1)&}));
&&&&&&&&&&&&//&&&&&&&&Console.WriteLine("Count&on&typed&collection:&{0}",&collection.Count(new&{&Corners&=&Op.GreaterThan(1)&}));
&&&&&&&&&&&&//&&&&&&&&var&coll&=&db.GetCollection("MyClass");
&&&&&&&&&&&&//&&&&&&&&var&count&=&coll.Count(new&Document("Corners",&Op.GreaterThan(1)));
&&&&&&&&&&&&//&&&&&&&&Console.WriteLine("Count:&{0}",&count);
&&&&&&&&&&&&//&&&&&&&&Console.ReadKey();
&&&&&&&&&&&&//&&&&}
&&&&&&&&&&&&//&&&&finally
&&&&&&&&&&&&//&&&&{
&&&&&&&&&&&&//&&&&&&&&mongo.Disconnect();
&&&&&&&&&&&&//&&&&}
&&&&&&&&&&&&//}
&&&&&&&&&&&&#endregion
&&&&&&&&&&&&var&main&=&new&MainClass();
&&&&&&&&&&&&main.Setup();
&&&&&&&&&&&&main.Run();
&&&&&&&&&&&&Console.ReadLine();
&&&&&&&&///&&summary&
&&&&&&&&///&&&Setup&the&collection&and&insert&some&data&into&it.
&&&&&&&&///&&/summary&
&&&&&&&&public&void&Setup()
&&&&&&&&&&&&//从配置文件读取连接字符串&IP+端口
&&&&&&&&&&&&var&connstr&=&ConfigurationManager.AppSettings["simple"];
&&&&&&&&&&&&if(String.IsNullOrEmpty(connstr))
&&&&&&&&&&&&&&&&throw&new&ArgumentNullException("Connection&string&not&found.");
&&&&&&&&&&&&//创建Mongo数据服务及连接
&&&&&&&&&&&&mongo&=&new&Mongo(connstr);
&&&&&&&&&&&&mongo.Connect();
&&&&&&&&&&&&//获取数据库实例(如果该实例不存,就会自动创建simple实例)
&&&&&&&&&&&&simple&=&mongo["simple"];
&&&&&&&&&&&&//获取表名(如果该表名不存在,就会自动创建categories表名)
&&&&&&&&&&&&categories&=&simple.GetCollection&Document&("categories");
&&&&&&&&&&&&//添加记录前清除所有记录
&&&&&&&&&&&&Clean();
&&&&&&&&&&&&var&names&=&new[]&{"Bluez",&"Jazz",&"Classical",&"Rock",&"Oldies",&"Heavy&Metal"};
&&&&&&&&&&&&//循环插入记录&doucment会自动生成键值_id,id的编码体现了数据的插入顺序
&&&&&&&&&&&&foreach(var&name&in&names)
&&&&&&&&&&&&&&&&categories.Insert(new&Document&{{"name",&name}});
&&&&&&&&public&void&Clean()
&&&&&&&&&&&&//删除document&name&为Jazz的记录
&&&&&&&&&&&&categories.Remove(new&Document&{{"name",&"Jazz"}});&//remove&documents&with&the&name&Jazz.
&&&&&&&&&&&&//删除所有记录集
&&&&&&&&&&&&categories.Remove(new&Document());&//remove&everything&from&the&categories&collection.
&&&&&&&&public&void&Run()
&&&&&&&&&&&&//查找单条记录&参数类型为Document
&&&&&&&&&&&&var&category&=&categories.FindOne(new&Document&{{"name",&"Bluez"}});
&&&&&&&&&&&&Console.WriteLine("The&id&findOne"&+&category["_id"]);
&&&&&&&&&&&&//更新1&用键值ID读取对象,并更新字段值,保存
&&&&&&&&&&&&var&selector&=&new&Document&{{"_id",&category["_id"]}};
&&&&&&&&&&&&category["name"]&=&"Bluess";
&&&&&&&&&&&&//The&following&will&do&the&same&thing.
&&&&&&&&&&&&categories.Save(category);
&&&&&&&&&&&&Console.WriteLine("Category&after&one&update&"&+&categories.FindOne(selector));
&&&&&&&&&&&&//更新2&Update参数1去更新参数2并保存
&&&&&&&&&&&&category["name"]&=&"Blues";
&&&&&&&&&&&&categories.Update(category,&selector);
&&&&&&&&&&&&Console.WriteLine("Category&after&two&updates&"&+&categories.FindOne(selector));
&&&&&&&&&&&&//Find&it&by&_id&that&has&been&converted&to&a&string&now.
&&&&&&&&&&&&var&id&=&(category["_id"]).ToString();
&&&&&&&&&&&&//注意:&这里id.ToString()与id.ToOid()&(为什么类扩展这个方法,我也没明白,是不是id!=24&位会出现转义字符要替换掉)
&&&&&&&&&&&&Console.WriteLine(string.Format("Found&by&string&id[{0}]&converted&back&to&Oid[{1}]",id.ToString(),id.ToOid()));
&&&&&&&&&&&&Console.WriteLine(categories.FindOne(new&Document&{{"_id",&id.ToOid()}}));
&&&&&&&&&&&&//Find(new&Document())&is&equivalent&to&FindAll();
&&&&&&&&&&&&//Specifying&the&cursor&in&a&using&block&will&close&it&on&the&server&if&we&decide&not
&&&&&&&&&&&&//to&iterate&through&the&whole&thing.
&&&&&&&&&&&&Console.WriteLine("输出所有对象.........");
&&&&&&&&&&&&using(var&all&=&categories.Find(new&Document()))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&foreach(var&doc&in&all.Documents)
&&&&&&&&&&&&&&&&&&&&Console.WriteLine(doc.ToString());
&&&&&&&&&&&&}
&&&&&&&&&&&&mongo.Disconnect();
//类扩展ToOid方法到string中
public&static&class&OidExtensions
&&&&public&static&Oid&ToOid(this&string&str)
&&&&&&&&if(str.Length&==&24)
&&&&&&&&&&&&return&new&Oid(str);
&&&&&&&&return&new&Oid(str.Replace("\"",&""));
以上为MongoDB的数据库连接及CRUD操作(Document方式),我们来测试一下,数据库实例,表,记录是否创建成功了呢?
打开上一章提到的Bin文件夹下的Mongo.exe程序 按图示输入命令查看
入门Demo就演示到这里了,有点简单,我也在是一边学习一边分享。Demo就不提供下载了,都在samus里面,只是我这边加了注释。
上一节我们在samus的simple例子简单的入门了,这一节将要探讨的问题写个简要
继续关系对象的存储
类关系分析
一、对象存储
继续在samus源码上分析,依然是simple的例子。Demo中.net 3.5特性基本上都涉及了。
&public&static&void&Main(string[]&args)
&&&&&&&&&&&&#region&以下为Mongo配置及关系映射部分
&&&&&&&&&&&&//var&config&=&new&MongoConfigurationBuilder();
&&&&&&&&&&&&//COMMENT&OUT&FROM&HERE
&&&&&&&&&&&&//config.Mapping(mapping&=&
&&&&&&&&&&&&//{
&&&&&&&&&&&&//&&&&mapping.DefaultProfile(profile&=&
&&&&&&&&&&&&//&&&&{
&&&&&&&&&&&&//&&&&&&&&profile.SubClassesAre(t&=&&t.IsSubclassOf(typeof(MyClass)));
&&&&&&&&&&&&//&&&&});
&&&&&&&&&&&&//&&&&mapping.Map&MyClass&();
&&&&&&&&&&&&//&&&&mapping.Map&SubClass&();
&&&&&&&&&&&&//});
&&&&&&&&&&&&//&TO&HERE
&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&//config.ConnectionString("Server=127.0.0.1");
&&&&&&&&&&&&//using&(Mongo&mongo&=&new&Mongo(config.BuildConfiguration()))
&&&&&&&&&&&&using&(Mongo&mongo&=&new&Mongo("Server=127.0.0.1"))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&mongo.Connect();
&&&&&&&&&&&&&&&&try
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&//索引器方式mogo["TestDb"]
&&&&&&&&&&&&&&&&&&&&var&db&=&mongo.GetDatabase("TestDb");
&&&&&&&&&&&&&&&&&&&&//老版不支持泛型的时候写法是这样的db.GetCollection("Name")&-&看源码重构了一个MongoCollection_1类
&&&&&&&&&&&&&&&&&&&&//将老版方法重构为db.GetCollection&Documnet&("Name");
&&&&&&&&&&&&&&&&&&&&//此方法其实将类名反射为集合&db.GetCollection&MyClass&("MyClass")
&&&&&&&&&&&&&&&&&&&&var&collection&=&db.GetCollection&MyClass&();
&&&&&&&&&&&&&&&&&&&&//.net&3.5集合初始化特性&创建3个对象(2个MyClass,1个子类SubClass)
&&&&&&&&&&&&&&&&&&&&MyClass&square&=&new&MyClass()
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&Corners&=&4,
&&&&&&&&&&&&&&&&&&&&&&&&Name&=&"Square"
&&&&&&&&&&&&&&&&&&&&};
&&&&&&&&&&&&&&&&&&&&MyClass&circle&=&new&MyClass()
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&Corners&=&0,
&&&&&&&&&&&&&&&&&&&&&&&&Name&=&"Circle"
&&&&&&&&&&&&&&&&&&&&};
&&&&&&&&&&&&&&&&&&&&SubClass&sub&=&new&SubClass()
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&Name&=&"SubClass",
&&&&&&&&&&&&&&&&&&&&&&&&Corners&=&6,
&&&&&&&&&&&&&&&&&&&&&&&&Ratio&=&3.43
&&&&&&&&&&&&&&&&&&&&};
&&&&&&&&&&&&&&&&&&&&//保存对象
&&&&&&&&&&&&&&&&&&&&collection.Save(square);
&&&&&&&&&&&&&&&&&&&&collection.Save(circle);
&&&&&&&&&&&&&&&&&&&&collection.Save(sub);
&&&&&&&&&&&&&&&&&&&&#region&LINQ写法读取数据
&&&&&&&&&&&&&&&&&&&&//var&superclass&=&(from&item&in&db.GetCollection&MyClass&("MyClass").Linq()
&&&&&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&where&item.Corners&&&1
&&&&&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&select&item.Corners).ToList();
&&&&&&&&&&&&&&&&&&&&//var&subclass&=&(from&item&in&db.GetCollection&SubClass&("MyClass").Linq()
&&&&&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&where&item.Ratio&&&1
&&&&&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&select&item.Corners).ToList();
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&//Lambda写法
&&&&&&&&&&&&&&&&&&&&//读取集合MyClass所有对象
&&&&&&&&&&&&&&&&&&&&Console.WriteLine("Count&by&LINQ&on&typed&collection:&{0}",&collection.Linq().Count(x&=&&x.Corners&&&1));
&&&&&&&&&&&&&&&&&&&&//读取集合为SubClass的对象(由于SubClass被保存到MyClass集合中了,故结果为0)
&&&&&&&&&&&&&&&&&&&&Console.WriteLine("Count&by&LINQ&on&typed&collection2:&{0}",&db.GetCollection&SubClass&().Linq().Count(x&=&&x.Corners&&&1));
&&&&&&&&&&&&&&&&&&&&//Console.WriteLine("Count&by&LINQ&on&typed&collection3:&{0}",&db.GetCollection&SubClass&().Count(new&{&Corners&=&Op.GreaterThan(1)&}));
&&&&&&&&&&&&&&&&&&&&//注:op&是Document的子类&虽然我们存的是其它对象,但所有的对象最终都是以Document类型存储的,
&&&&&&&&&&&&&&&&&&&&//也就意味检索数据也是Document方式查找或统计了,以下Lambda方式的统计就体现了
&&&&&&&&&&&&&&&&&&&&//在基类中大家可以看到都是count(new&Document())方式及条件查询的,这里介绍完了,下面的代码就容易理解了
&&&&&&&&&&&&&&&&&&&&Console.WriteLine("Count&on&typed&collection:&{0}",&collection.Count(new&{&Corners&=&Op.GreaterThan(1)&}));
&&&&&&&&&&&&&&&&&&&&var&count&=&collection.Count(new&Document("Corners",&Op.GreaterThan(1)));
&&&&&&&&&&&&&&&&&&&&Console.WriteLine("Count:&{0}",&count);
&&&&&&&&&&&&&&&&&&&&Console.ReadKey();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&finally
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&mongo.Disconnect();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&//var&main&=&new&MainClass();
&&&&&&&&&&&&//main.Setup();
&&&&&&&&&&&&//main.Run();
&&&&&&&&&&&&Console.ReadLine();
看一下结果:
在打开mongo.exe查看一下结果
是不是很奇怪,MyClass,SubClass对象又没有标记为可序列化,如何就被保存下来了?难道是通过反射对实现的,看看源码
二、继续关系对象的存储
当数据保存为文档记录时,MongoDB是如何识别这个两类是有继承关系的呢?我们接着下面的代码修改一下继续
先删除上次的记录,在mongo.exe中运行db.MyClass.drop()
删除集合中的数据,查看更多操作集合的命令可执行db.MyClass.help
mongo.exe脚本命令官方介绍用的是Javascript脚本,从命名可以看出是它的影子。mongo.exe的脚本学习可参照这个链接
http://special.csdn.net/mongodb/index.html&
& & & & public&static&void&Main(string[]&args)
&&&&&&&&&&&&#region&以下为Mongo配置及关系映射部分
&&&&&&&&&&&&var&config&=&new&MongoConfigurationBuilder();
&&&&&&&&&&&&//COMMENT&OUT&FROM&HERE&建立两者的关系
&&&&&&&&&&&&config.Mapping(mapping&=&
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&mapping.DefaultProfile(profile&=&
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&profile.SubClassesAre(t&=&&t.IsSubclassOf(typeof(MyClass)));
&&&&&&&&&&&&&&&&});
&&&&&&&&&&&&&&&&mapping.Map&MyClass&();
&&&&&&&&&&&&&&&&mapping.Map&SubClass&();
&&&&&&&&&&&&});
&&&&&&&&&&&&//&TO&HERE
&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&config.ConnectionString("Server=127.0.0.1");
&&&&&&&&&&&&//将配置注入Mongo类中
&&&&&&&&&&&&using&(Mongo&mongo&=&new&Mongo(config.BuildConfiguration()))
&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&mongo.Connect();
&&&&&&&&&&&&&&&&try
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&//索引器方式mogo["TestDb"]
&&&&&&&&&&&&&&&&&&&&var&db&=&mongo.GetDatabase("TestDb");
&&&&&&&&&&&&&&&&&&&&//老版不支持泛型的时候写法是这样的db.GetCollection("Name")&-&看源码重构了一个MongoCollection_1类
&&&&&&&&&&&&&&&&&&&&//将老版方法重构为db.GetCollection&Documnet&("Name");
&&&&&&&&&&&&&&&&&&&&//此方法其实将类名反射为集合&db.GetCollection&MyClass&("MyClass")
&&&&&&&&&&&&&&&&&&&&var&collection&=&db.GetCollection&MyClass&();
&&&&&&&&&&&&&&&&&&&&//.net&3.5集合初始化特性&创建3个对象(2个MyClass,1个子类SubClass)
&&&&&&&&&&&&&&&&&&&&MyClass&square&=&new&MyClass()
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&Corners&=&4,
&&&&&&&&&&&&&&&&&&&&&&&&Name&=&"Square"
&&&&&&&&&&&&&&&&&&&&};
&&&&&&&&&&&&&&&&&&&&MyClass&circle&=&new&MyClass()
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&Corners&=&0,
&&&&&&&&&&&&&&&&&&&&&&&&Name&=&"Circle"
&&&&&&&&&&&&&&&&&&&&};
&&&&&&&&&&&&&&&&&&&&SubClass&sub&=&new&SubClass()
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&Name&=&"SubClass",
&&&&&&&&&&&&&&&&&&&&&&&&Corners&=&6,
&&&&&&&&&&&&&&&&&&&&&&&&Ratio&=&3.43
&&&&&&&&&&&&&&&&&&&&};
&&&&&&&&&&&&&&&&&&&&//保存对象
&&&&&&&&&&&&&&&&&&&&collection.Save(square);
&&&&&&&&&&&&&&&&&&&&collection.Save(circle);
&&&&&&&&&&&&&&&&&&&&collection.Save(sub);
&&&&&&&&&&&&&&&&&&&&#region&LINQ写法读取数据
&&&&&&&&&&&&&&&&&&&&//var&superclass&=&(from&item&in&db.GetCollection&MyClass&("MyClass").Linq()
&&&&&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&where&item.Corners&&&1
&&&&&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&&&select&item.Corners).ToList();
&&&&&&&&&&&&&&&&&&&&//var&subclass&=&(from&item&in&db.GetCollection&SubClass&("MyClass").Linq()
&&&&&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&where&item.Ratio&&&1
&&&&&&&&&&&&&&&&&&&&//&&&&&&&&&&&&&&&&select&item.Corners).ToList();
&&&&&&&&&&&&&&&&&&&&#endregion
&&&&&&&&&&&&&&&&&&&&//Lambda写法
&&&&&&&&&&&&&&&&&&&&//读取集合MyClass所有对象
&&&&&&&&&&&&&&&&&&&&Console.WriteLine("Count&by&LINQ&on&typed&collection:&{0}",&collection.Linq().Count(x&=&&x.Corners&&&1));
&&&&&&&&&&&&&&&&&&&&//读取集合为SubClass的对象(由于SubClass被保存到MyClass集合中了,故结果为0)
&&&&&&&&&&&&&&&&&&&&Console.WriteLine("Count&by&LINQ&on&typed&collection2:&{0}",&db.GetCollection&SubClass&().Linq().Count(x&=&&x.Corners&&&1));
&&&&&&&&&&&&&&&&&&&&//Console.WriteLine("Count&by&LINQ&on&typed&collection3:&{0}",&db.GetCollection&SubClass&().Count(new&{&Corners&=&Op.GreaterThan(1)&}));
&&&&&&&&&&&&&&&&&&&&//注:op&是Document的子类&虽然我们存的是其它对象,但所有的对象最终都是以Document类型存储的,
&&&&&&&&&&&&&&&&&&&&//也就意味检索数据也是Document方式查找或统计了,以下Lambda方式的统计就体现了
&&&&&&&&&&&&&&&&&&&&//在基类中大家可以看到都是count(new&Document())方式及条件查询的,这里介绍完了,下面的代码就容易理解了
&&&&&&&&&&&&&&&&&&&&Console.WriteLine("Count&on&typed&collection:&{0}",&collection.Count(new&{&Corners&=&Op.GreaterThan(1)&}));
&&&&&&&&&&&&&&&&&&&&var&count&=&collection.Count(new&Document("Corners",&Op.GreaterThan(1)));
&&&&&&&&&&&&&&&&&&&&Console.WriteLine("Count:&{0}",&count);
&&&&&&&&&&&&&&&&&&&&Console.ReadKey();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&finally
&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&mongo.Disconnect();
&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&}
&&&&&&&&&&&&//var&main&=&new&MainClass();
&&&&&&&&&&&&//main.Setup();
&&&&&&&&&&&&//main.Run();
&&&&&&&&&&&&Console.ReadLine();
再看mongo.exe中的记录:
三、LINQ的体现
&&#region&LINQ写法读取数据
&&&&&&&&&&&&&&&&&&&&var&myCollection&=&(from&item&in&db.GetCollection&MyClass&("MyClass").Linq()
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&where&item.Corners&&&1
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&select&item).ToList();
&&&&&&&&&&&&&&&&&&&&foreach&(MyClass&my&in&myCollection)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&Console.WriteLine(my.Name+":"+my.Corners.ToString());
&&&&&&&&&&&&&&&&&&&&}
&&&&&&&&&&&&&&&&&&&&var&subCollection&=&(from&item&in&db.GetCollection&SubClass&("MyClass").Linq()
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&where&item.Ratio&&&1
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&select&item).ToList();
&&&&&&&&&&&&&&&&&&&&foreach&(SubClass&subClass&in&subCollection)
&&&&&&&&&&&&&&&&&&&&{
&&&&&&&&&&&&&&&&&&&&&&&&Console.WriteLine(subClass.Name+":"+subClass.Ratio.ToString());
&&&&&&&&&&&&&&&&&&&&}
&&&&&&小困惑我想想学到了好文章赶紧学标签: ,,注:与内容无关的评论将被删除,严重者禁用帐号! |
&&|&&最新评论不吐不快,赶紧来一发!栏目推荐热门点击本站推荐
| 服务协议 | 隐私权保护 | 开放平台 | 广告服务 | PHP1招聘 | PHP1公益 | 客服中心
| Copyright (C) 1998 - . All Rights Reserved
第一PHP社区}

我要回帖

更多关于 mongodb批量更新 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信