zoukankan      html  css  js  c++  java
  • AspNetCoreMvc使用MongoDB,快来get一下吧。

     看这篇文章之前请耐心看完MongoDb入门,如果还是坚持不看,那我也没有办法。

    MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 它的特点是高性能、易部署、易使用,存储数据非常方便。

    用之前的花,先通过nuget包get一下。

    一.集成你自己的MongoDbOperation

    这和我们ADO.NET,大家写的DBhelper差不多,其中只是小有变化。下面是一个helper类,我们基本上都是通过依赖注入你配置构造属性,其实的collection和db是我们最主要的配置项。

    private static MongoDBOperation<T> mongoDBOperation = null;
    private MongoDBOperation()
            {
                mongoClient = new MongoClient("mongodb://localhost:27017");
                db = mongoClient.GetDatabase("local");
                collection = db.GetCollection<BsonDocument>("zara");
            }

    通过构造函数我们完成了基本的配置,再通过泛型构造去创建我们MongoDbOperation的实例,这个实例是通过控制器方面的依赖注入进去的。

     public static MongoDBOperation<T> GetMongoDBInstance()
            {
                if (mongoDBOperation == null)
                {
                    lock (nameof(MongoDBOperation<T>))// lockobject)
                    {
                        if (mongoDBOperation == null)
                        {
                            mongoDBOperation = new MongoDBOperation<T>();
                        }
                    }
                }
    
                return mongoDBOperation;
            }
    

     在控制器方面直接通过依赖注入直接Get 到了 MongoDBOperation实例。

    private MongoDBOperation<BsonDocument> mongo = null;
            public MongoDBController()
            {
                mongo = MongoDBOperation<BsonDocument>.GetMongoDBInstance();
            }

     那最后基本上就是在MongoDBOperation类中写你需要的方法了,附一份我自己写的:

    namespace MongoDbDemo.Options
    {
        public class MongoDBOperation<T> where T : class
        {
            private static MongoDBOperation<T> mongoDBOperation = null;
            private static readonly object lockobject = new object();
            private MongoClient mongoClient { get; set; }
            private IMongoDatabase db { get; set; }
            private IMongoCollection<BsonDocument> collection { get; set; }
            private IEnumerable<BsonDocument> documents { get; set; }
    
            private MongoDBOperation()
            {
                mongoClient = new MongoClient("mongodb://localhost:27017");
                db = mongoClient.GetDatabase("local");
                collection = db.GetCollection<BsonDocument>("zara");
            }
            public static MongoDBOperation<T> GetMongoDBInstance()
            {
                if (mongoDBOperation == null)
                {
                    lock (nameof(MongoDBOperation<T>))// lockobject)
                    {
                        if (mongoDBOperation == null)
                        {
                            mongoDBOperation = new MongoDBOperation<T>();
                        }
                    }
                }
    
                return mongoDBOperation;
            }
    
            /// <summary>
            /// 同步插入数据
            /// </summary>
            /// <param name="document"></param>
            /// <returns></returns>
            public bool InsertOneData(BsonDocument document)
            {
                try
                {
                    if (collection != null)
                    {
                        collection.InsertOne(document);
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                catch (Exception ex)
                {
                    return false;
                }
    
            }
    
            /// <summary>
            /// 异步插入
            /// </summary>
            /// <param name="document"></param>
            /// <returns></returns>
            public async Task<bool> InsertAsyncOneData(BsonDocument document)
            {
                try
                {
                    if (collection != null)
                    {
                        await collection.InsertOneAsync(document);
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                catch (Exception ex)
                {
                    return false;
                }
            }
    
            /// <summary>
            /// 同步插入多条数据
            /// </summary>
            /// <param name="documents"></param>
            /// <returns></returns>
            public bool InsertManyData(IEnumerable<BsonDocument> documents)
            {
                try
                {
                    //documents = Enumerable.Range(0, 100).Select(i => new BsonDocument("counter", i));
                    if (collection != null)
                    {
                        collection.InsertMany(documents);
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                catch (Exception ex)
                {
                    return false;
                }
    
            }
    
            /// <summary>
            /// 同步插入多条数据
            /// </summary>
            /// <param name="documents"></param>
            /// <returns></returns>
            public async Task<bool> InsertAsyncManyData(IEnumerable<BsonDocument> documents)
            {
                try
                {
                    //documents = Enumerable.Range(0, 100).Select(i => new BsonDocument("counter", i));
                    if (collection != null)
                    {
                        await collection.InsertManyAsync(documents);
                        return true;
                    }
                    else
                    {
                        return false;
                    }
                }
                catch (Exception ex)
                {
                    return false;
                }
    
            }
    
            /// <summary>
            /// 查找有数据。
            /// </summary>
            /// <returns></returns>
            public List<BsonDocument> FindData()
            {
                return collection.Find(new BsonDocument()).ToList();
            }
    
            /// <summary>
            /// 取排除_id字段以外的数据。然后转换成泛型。
            /// </summary>
            /// <returns></returns>
            public List<BsonDocument> FindAnsyncData()
            {
                var document = collection.Find(new BsonDocument()).ToListAsync().Result;
                return document;
            }
    
            /// <summary>
            /// 按某些列条件查询
            /// </summary>
            /// <param name="bson"></param>
            // <returns></returns>
            public List<BsonDocument> FindFilterlData(BsonDocument bson)
            {
                var buildfilter = Builders<BsonDocument>.Filter;
                FilterDefinition<BsonDocument> filter = null;
    
                foreach (var bs in bson)
                {
                    filter = buildfilter.Eq(bs.Name, bs.Value);
                }
                //filter = buildfilter.Eq("name", "MongoDBTest");
                var documents = collection.Find(filter).ToList();
                return documents;
            }
    
    
            /// <summary>
            /// 返回受影响行
            /// </summary>
            /// <returns></returns>
            public long DeleteData()
            {
                //删除count大于0的文档。
                var filter = Builders<BsonDocument>.Filter.Gt("count", 0);
                DeleteResult deleteResult = collection.DeleteMany(filter);
                return deleteResult.DeletedCount;
            }
    
            /// <summary>
            /// 根据id更新文档中单条数据。
            /// </summary>
            /// <param name="_id"></param>
            /// <param name="bson"></param>
            public UpdateResult UpdateOneData(string _id, BsonDocument bson)
            {
                //修改条件(相当于sql where)
                FilterDefinition<BsonDocument> filter = Builders<BsonDocument>.Filter.Eq("name", "MongoDB");
                UpdateDefinition<BsonDocument> update = null;
                foreach (var bs in bson)
                {
                    if (bs.Name.Equals("name"))
                    {
                        update = Builders<BsonDocument>.Update.Set(bs.Name, bs.Value);
                    }
                }
                //UpdateDefinition<BsonDocument> update = Builders<BsonDocument>.Update.Set("name", bson[0].ToString());
                UpdateResult result = collection.UpdateOne(filter, update);//默认更新第一条。
                return result;
            }
            /// <summary>
            /// bsonvalue to list<string>
            /// </summary>
            public List<string> getStrListByBson(BsonValue bsonValuestr)
            {
                return bsonValuestr.ToString().Trim('[').Trim(']').Split(",").ToList();
            }
            /// <summary>
            /// 根据_id删除文档行
            /// </summary>
            public long DelDocumentById(string _id)
            {
                var filter = Builders<BsonDocument>.Filter.Eq("_id", new ObjectId(_id));
                DeleteResult result = collection.DeleteOne(filter);
                return result.DeletedCount;
            }
        }
    }

      如果说你不知道里面的方法,你可以通通过F12去看collection中的方法(前提你是在VS的情况下)

     

    我们再通过这玩腻去搞个小demo,控制器:

    public class MongoDBController : Controller
        {
            private MongoDBOperation<BsonDocument> mongo = null;
            public MongoDBController()
            {
                mongo = MongoDBOperation<BsonDocument>.GetMongoDBInstance();
            }
            /// <summary>
            /// get首次加载
            /// </summary>
            /// <returns>返回视图模型</returns>
            public IActionResult Index()
            {
                List<MongoDbModel> mdList = new List<MongoDbModel>();
                if (mongo != null)
                {
                    List<BsonDocument> document = mongo.FindAnsyncData();
                    for (int i = 0; i < document.Count; i++)
                    {
                        MongoDbModel md = new MongoDbModel()
                        {
                            id = document[i]["_id"].ToString(),
                            title = document[i]["title"].ToString(),
                            url = document[i]["title"].ToString(),
                            likes = document[i]["likes"].ToDouble(),
                            tags = mongo.getStrListByBson(document[i]["tags"])
                        };
                        mdList.Add(md);
                    }
                }
                return View(mdList);
            }
            /// <summary>
            /// 查询
            /// </summary>
            /// <param name="dbname">条件1</param>
            /// <returns>mongoDbList</returns>
            public IActionResult queryMongoDb(string dbname)
            {
                List<MongoDbModel> mdList = new List<MongoDbModel>();
                if (!string.IsNullOrWhiteSpace(dbname))
                {
                    List<BsonDocument> document = mongo.FindFilterlData(new BsonDocument() {
                        {"title",dbname}
                    });
                    for (int i = 0; i < document.Count; i++)
                    {
                        MongoDbModel md = new MongoDbModel()
                        {
                            id = document[i]["_id"].ToString(),
                            title = document[i]["title"].ToString(),
                            url = document[i]["title"].ToString(),
                            likes = document[i]["likes"].ToDouble(),
                            tags = mongo.getStrListByBson(document[i]["tags"])
                        };
                        mdList.Add(md);
                    }
                }
                return PartialView("MongoDbPartial", mdList);
            }
            public long delById(string id)
            {
                return mongo.DelDocumentById(id);
            }
    

      在view中我想减小耦合度,如果是非常复杂的页面中,前提这不是MVVM,我一般喜欢把局部视图放到Shared文件夹中,其定义如下:

    @model IEnumerable<MongoDbDemo.Models.MongoDbModel>
    
    <table class="table">
        <thead>
            <tr>
                <th>
                    @Html.DisplayNameFor(model => model.id)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.title)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.url)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.tags)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.likes)
                </th>
                <th></th>
            </tr>
        </thead>
        <tbody>
            @foreach (var item in Model)
            {
                <tr>
                    <td>
                        @Html.DisplayFor(modelItem => item.id)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.title)
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.url)
                    </td>
                    <td>
                        @{
                            foreach (var tagsItems in item.tags)
                            {
                                <p>@tagsItems</p>
                            }
                        }
                    </td>
                    <td>
                        @Html.DisplayFor(modelItem => item.likes)
                    </td>
                    <td>
                        @Html.ActionLink("Delete", "delById", "MongoDB",new { id = item.id})
                    </td>
                </tr>
            }
        </tbody>
    </table>
    

      主视图,直接通过 @Html.Partial 标签进行引用。

    @model IEnumerable<MongoDbDemo.Models.MongoDbModel>
    
    @{
        Layout = null;
    }
    <script typet="text/javascript" src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script>
    <!DOCTYPE html>
    
    <html>
    <head>
        <meta name="viewport" content="width=device-width" />
        <title>Index</title>
    </head>
    <body>
        <form>
            <p>
                <a asp-action="Create">Create New</a>
                <div>
                    名称:<input type="text" placeholder="条件1" id="selName"/>
                    <input type="button" value="查询" id="butn" />
                </div>
                <div id="datamain">
                    @Html.Partial("/Views/Shared/MongoDbPartial.cshtml", Model)
                </div>
            </p>
        </form>
        <script>
            $(function () {
                $("#butn").click(function () {
                    var nameval = $("#selName").val();
                    alert(nameval);
                    $.ajax({
                        url: "/MongoDB/queryMongoDb",
                        data: { dbname: nameval },
                        type: "get",
                        success: function (datas) {
                            console.log(datas);
                            $("#datamain").html(datas);
                        }
                    })
                })
            })
        </script>
    </body>
    </html>
    

     最后附MongoDb官方文档:https://docs.mongodb.com/

     

  • 相关阅读:
    3.4函数重载和默认参数
    命名空间
    Pandas中DataFrame数据合并、连接(concat、merge、join)之concat
    使用python脚本进行数据清洗(1)
    python操作hive 安装和测试
    Microsoft Visual C++ 14.0 is required.
    hive传递参数与调用
    log1p和expm1
    github高速下载的方法
    group_concat()
  • 原文地址:https://www.cnblogs.com/ZaraNet/p/10019487.html
Copyright © 2011-2022 走看看