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

                       

  • 相关阅读:
    JVM虚拟机
    antd Table排序问题
    关于element-ui中el-container布满全局的问题!
    vue 安装css预处理器LESS
    mybatis官网
    Lombok安装及使用介绍
    thymeleaf中th:each的使用,遍历数组
    thymeleaf中th:text和th:utext的使用与区别
    SprongBoot项目的打包与启动
    SpringBoot简单学习
  • 原文地址:https://www.cnblogs.com/msql/p/4892101.html
Copyright © 2020-2023  润新知