zoukankan      html  css  js  c++  java
  • 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中的一点心得,高手们如果有更好的理解或方法还请指教小弟!!

                       

  • 相关阅读:
    Exchange 2013与 Office Web Apps 整合
    SharePoint2013 以其他用户登录和修改AD域用户密码 功能
    sharepoint 2010 自定义页面布局
    sharepoint 2010 记录管理 对象模型
    SharePoint2010 对象模型 关联列表
    在SharePoint Server 2010中更改“我的网站”
    xenapp 6.5 客户端插件第一次安装总是跳到官网
    如何解决在Windows Server 2008 R2 上安装证书服务重启后出现 CertificationAuthority 91错误事件
    在Win7 Hyper-v虚拟机中挂接真实机的声卡
    win8 中如何删除 共享文件夹 用户名和密码
  • 原文地址:https://www.cnblogs.com/msql/p/4892101.html
Copyright © 2011-2022 走看看