C#操作Mongodb的心得
Mongodb是一个强大的文档型数据库,采用BSON的数据格式。本文主要采用其官方的C#驱动来操作其表中的集合。驱动版本为1.1.0,下载地址为:
http://mongodb.github.io/mongo-csharp-driver/?jmp=docs
纯属个人实践的一点心得,记录如下:
1:连接数据库: 这里驱动文档中有详细的说明,这里我就不再啰嗦了,只需要记录一点:
如果数据库为从库的情况下要加入一个设置:
databaseSettings.SlaveOk = true;
string connString = MongoConnectionStrng(configName);
server = new MongoClient(connString).GetServer();
databaseName = new MongoUrl(connString).DatabaseName;
var databaseSettings =server.CreateDatabaseSettings(databaseName);
databaseSettings.SlaveOk = true;
database = server.GetDatabase(databaseSettings);
2:查询集合:这里主要想说的是用Linq来查询数据库中的集合。引入命名空间:MongoDB.Driver.Linq;
如果使用映射的类来查询的话,这里需要注意的是“映射类中的字段务必与该集合中的根级字段保持绝对一致” 否则会报映射错误。
Mongodb用映射类查询的这一限制其实很不方便。当一个集合很大且每条记录的字段都不一样时则无法使用Linq进行查询了。所
以鄙人还是使用了Mongodb固有的格式BsonDocument来进行查询。值得注意的是:在条件查询时C# where 条件中的参数务必
要与Mongodb中的数据类型保持一致。
var ids = search.skus.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
BsonArray idsArray = new BsonArray();
ids.ToList().ForEach(s => { idsArray.Add(long.Parse(s)); });
res = res.Where(s => idsArray.Contains(s["_id"]));
以上的 _id 字段在Mongodb中是 long 类型的,且这里为In查询。
要查询下一级节点的写法如下:
res = res.Where(s => s["Availability"]["Status"] == int.Parse(search.productStatus));
这里Status为Avaliability的子级节点且为int类型。
3:在Mongodb的查询中要注意,每一条记录的根节点也许是不一样的所以当查询 s["Availability"]["Status"] 而 Availability 节点不存在时,则会报错。这一点很不方便。
所以介意如果集合很大且每条数据不一致的情况下,可以考虑将其BsonDocument文档全部查出来在C#中进行过滤查询。我写了个通用的方法用来查询各节点的值并返
回字符串。
比如:m.ProductStatus = GetBsonValueByPath(s, "Availability.Status");
/// <summary>
/// 此方法为对bson结果集以 mongodb的查询方式进行解析如 aaa.bbb.ccc
/// 原来不用以此来解析,但生产环境数据有很多不一致所以才用
/// </summary>
/// <param name="bsonDoc">BsonDocument</param>
/// <param name="path">查询路径</param>
/// <returns></returns>
public string GetBsonValueByPath(BsonDocument bsonDoc, string path)
{
if (string.IsNullOrEmpty(path))
return string.Empty;
string result = null;
string[] fieldArray = path.Split(new char[] { '.' }, StringSplitOptions.RemoveEmptyEntries);
BsonDocument tempDoc =bsonDoc;
for (int i = 0; i < fieldArray.Length; i++)
{
string field = fieldArray[i];
BsonElement fieldBsonElem = tempDoc.Elements.Where(s => s.Name == field).FirstOrDefault();
if (null != fieldBsonElem && fieldBsonElem.Value!=BsonNull.Value && i != (fieldArray.Length - 1))
{
tempDoc = fieldBsonElem.Value.ToBsonDocument();
}
else
{
if (null == fieldBsonElem)
{
result = null;
}
else if (fieldBsonElem.Value == BsonNull.Value)
{
result = null;
}
else
{
result= fieldBsonElem.Value.ToString();
}
}
}
return result;
}
以上为我本人在查询Mongodb中的一点心得,高手们如果有更好的理解或方法还请指教小弟!!
C#操作Mongodb的心得的更多相关文章
- 32位下操作mongodb心得
本文出处:http://blog.csdn.net/chaijunkun/article/details/7236911,转载请注明. 随着互联网的变革,互联网的内容生成方式也逐渐地从网站生成转为用户 ...
- mongoose - 让node.js高效操作mongodb
Mongoose库简而言之就是在node环境中操作MongoDB数据库的一种便捷的封装,一种对象模型工具,类似ORM,Mongoose将数据库中的数据转换为JavaScript对象以供你在应用中使用. ...
- 【MongoDB for Java】Java操作MongoDB
上一篇文章: http://www.cnblogs.com/hoojo/archive/2011/06/01/2066426.html介绍到了在MongoDB的控制台完成MongoDB的数据操作,通过 ...
- PHP操作MongoDB学习笔记
<?php/*** PHP操作MongoDB学习笔记*///*************************//** 连接MongoDB数据库 **////*************** ...
- PHP操作Mongodb之增删改查篇
之前,我讲解过PHP中mongodb扩展的安装,及启动,链接操作[忘记了?去看看吧!PHP操作Mongodb之一].本文主要就是讲在PHP中Mongodb的增加,查询,修改及删除数据的操作. 1.增加 ...
- PHP操作Mongodb之高级查询篇
本文主要讲解PHP中Mongodb的除了增删改查的一些其他操作. 在PHP操作Mongodb之增删改查篇中我们介绍了PHP中Mongodb的增加.删除.修改及查询数据的操作.本文主要是将查询时用到的高 ...
- php操作mongodb中的ISODate格式日期
mongodb 中数据记录的日期格式为"dateCreated" : ISODate("2011-12-20T07:22:50.836Z")经过翻阅php官网中 ...
- nodejs操作mongodb
一.下载地址 https://www.mongodb.com/download-center#community 二.控制台操作mongodb 1.安装完后添加环境变量. 2.在某个根目录下新建dat ...
- nodejs操作mongodb数据库封装DB类
这个DB类也算是我经历了3个实际项目应用的,现分享出来,有需要的请借鉴批评. 上面的注释都挺详细的,我使用到了nodejs的插件mongoose,用mongoose操作mongodb其实蛮方便的. 关 ...
随机推荐
- android 无限循环的viewpager
思路 例如存在 A -B -C 需要在viewpager滑动时无限循环 1.我们可以设计 C' A B C A' C'与C相同,A'与A相同 2.滑动到A'时,则index回到1 3.滑动到C'时, ...
- TComboBox; 指定某一行,不给下拉,只读ReadOnly 伪装 实现
//cbb1: TComboBox; 指定某一行,不给下拉,自读伪装 实现: cbb1.Style :=csSimple; //设定style 不可以下拉 cbb1.ItemIndex := ; // ...
- Python爬虫学习(2): httplib
httplib模块实现了HTTP和HTTPS的客户端部分,但是一般不直接使用,经常通过urllib来进行HTTP,HTTPS的相关操作. 如果需要查看其源代码可以通过查找命令定位: find / -n ...
- Kinect的那些事儿
Kinect结合Unity3d跑酷游戏体感Demo 今天收拾东西,在柜子的翻出了一台崭新的Kinect,说起来真是惭愧,大学毕业那会儿,慈老师(和名字一位慈祥的好老师,也是我的毕业设计指导老师)赞 助 ...
- python3 抓取网页资源的 N 种方法
1. 最简单 import urllib.request response = urllib.request.urlopen('http://python.org/') html = response ...
- 【6集iCore3_ADP触摸屏驱动讲解视频】6-1 工程及程序构架介绍
视频简介: 该视频由银杏科技有限公司基于iCore3应用开发平台推出,包含 触摸屏驱动工程文件的介绍与程序构架的介绍等. 源视频包下载地址: http://pan.baidu.com/s/1dFz ...
- js中列表控件排序箭头,在wke中不支持的解决办法
列表中箭头,实际使用的在线css样式,wke不支持排序箭头(实际是字体)的在线css样式,可以客户端安装对应的字体,之后显示就正常了.
- C#.NET中数组、ArrayList和List三者的区别
数组在C#.NET中是最早出现的,在内存中是顺序连续存储的,所以它的索引速度非常快,赋值与修改元素也很简单:但是,也正因为数组是顺序连续存储的,在两个数据间插入数据是很不方便的,而且在声明数组的时候必 ...
- linux cntlm代理的配置
在linux下需要配置代理上网,如yum, wget等.如果直接配置windows下的代理,如下: export http_proxy=http://<proxyIP>:<port& ...
- Mysql 获取年级每个班前十学生的信息
select * from Table1 a where 10>(select count(*) from Table1 where ClsNo=a.ClsNo and Score>a.S ...