Core3.1WebApi使用MongoDB
好久没有使用MongoDB了,重新测试使用,版本不一样之前很多方法都使用不了了,下面为部分测试,下次再来更新测试
测试中使用的命令
// 新增读写的用户
db.createUser({
user:'fengge',
pwd:'FEG',
roles:["readWrite"]
}) //查询去掉 系统自带的objectid
db.student.find({},{_id:0}); //设置update _id=2的 name=ffff
db.student.update({_d:2},[{$set:{name:'ffff'}}]); // 查询包含有age的字段数据文档
db.student.find({age:{$exists:true}},{_id:0}); //写入当前时间
db.student.insert({_d:3,name:'ww',birthday:new Date()}); //对所有的文档新增字段 tel
db.student.updateMany({},{$set:{tel:110}}) // 往一个数组中新增一个字段,原来是这样的:{_d:3,name:'qq',books:['book1',book2']} => {_d:3,name:'qq',books:['book1',book2','西游记']}
db.student.updateOne({_d:3},{$push:{books:'西游记'}}) // 和上面想法的操作 往一个数组中去掉一个字段,原来是这样的:{_d:3,name:'qq',books:['book1',book2','西游记']} =>{_d:3,name:'qq',books:['book1',book2']}
db.student.updateOne({_d:3},{$pull:{books:'红楼梦'}}) // 这个是不对的,会在book集合里面在新增一个集合
db.student.updateOne( { _d: 2 },{$push:{books:['西游记']}}) docker run -itd --name zrfmongo --restart=always -p 27017:27017 mongo
contract:
using MongoDB.Bson;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Threading.Tasks;
using ZRF.Models; namespace ZRF.IContract
{
public interface ImongoContract<T> where T : class, new()
{
#region mongodb数据库的链接操作配置
IMongoCollection<T> GetCollection();
/// <summary>
/// 自定义 链接mongodb数据库字符串
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dbname"></param>
/// <param name="connectionStr"></param>
/// <returns></returns>
IMongoCollection<T> GetCollection(string dbname, string myconnectionStr = ""); #endregion #region 新增操作
bool InsertOne(T entity); Task<bool> InsertOneAsync(T entity); bool InsertMany(IEnumerable<T> entity); Task<bool> InsertManyAsync(IEnumerable<T> entity); #endregion #region 查询
T FindOneByFunc(Expression<Func<T, bool>> func); Task<T> FindOneByFuncAsync(Expression<Func<T, bool>> func); IEnumerable<T> FindList(Expression<Func<T, bool>> func); Task<IEnumerable<T>> FindListAsync(Expression<Func<T, bool>> func); Task<PageData> FindListByPagenationwithOrderAsyn(Expression<Func<T, bool>> where, bool orderAscTrue, Expression<Func<T, object>> OrderBy, int pageIndex = 1, int pageSize = 20);
Task<PageData> FindListByPagenationAsyn(Expression<Func<T, bool>> where, int pageIndex, int pageSize); /// <summary>
/// 根据条件查询
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="dics"></param>
/// <returns></returns>
Task<List<T>> QueryList(Dictionary<string, object> dics); #endregion #region 修改
/// <summary>
/// 编辑
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="entity"></param>
/// <param name="id"></param>
void Update(T entity, ObjectId id); /// <summary>
///
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
bool Update(T entity); #endregion #region 删除,备份
///// <summary>
///// 删除
///// remark:条件删除
///// </summary>
///// <typeparam name="T"></typeparam>
///// <param name="dics"></param>
//public static void Delete<T>(Dictionary<string, object> dics) where T : class, new()
//{
// var col = GetCollection<T>(); // var query = new QueryDocument(dics); // var result = col.Remove(query);
//} ///// <summary>
///// 删除
///// remark:根据ObjectId删除
///// </summary>
///// <typeparam name="T"></typeparam>
///// <param name="id"></param>
//public static void Delete<T>(ObjectId id) where T : class, new()
//{
// var col = GetCollection<T>();
// IMongoQuery query = Query.EQ("_id", id);
// col.Remove(query);
//}
#endregion
}
}
service:
1 using System.Threading.Tasks;
2 using ZRF.Models;
3
4 namespace ZRF.Service
5 {
6 using System.Collections.Generic;
7 using ZRF.IContract;
8 using ZRF.MyMongoDB;
9 using System.Linq.Expressions;
10 using System;
11 using MongoDB.Driver;
12 using MongoDB.Driver.Linq;
13 using MongoDB.Bson;
14 using MongoDB.Driver.Builders;
15 using System.Linq;
16
17 public class mongoService<T> : ImongoContract<T> where T : class, new()
18 {
19 #region mongodb数据库的链接操作配置
20
21 //只是简单的来测试一下,先不放在配置里面了
22 private static readonly string connectionStr = "mongodb://zrf_fengge:FEG_ZRF@47.217.66.39:27017/zrfmongodb";
23 private static readonly string dbName = "zrfmongodb";
24 public IMongoCollection<T> GetCollection()
25 {
26 IMongoClient client = new MongoClient(connectionStr);
27 return client.GetDatabase(dbName).GetCollection<T>(typeof(T).Name);
28 }
29
30 /// <summary>
31 /// 自定义 链接mongodb数据库字符串
32 /// </summary>
33 /// <typeparam name="T"></typeparam>
34 /// <param name="dbname"></param>
35 /// <param name="connectionStr"></param>
36 /// <returns></returns>
37 public IMongoCollection<T> GetCollection(string dbname, string myconnectionStr = "")
38 {
39 IMongoClient client;
40 if (myconnectionStr == "")
41 {
42 client = new MongoClient(myconnectionStr);
43 }
44 else
45 {
46 client = new MongoClient(connectionStr);
47 }
48 return client.GetDatabase(dbname).GetCollection<T>(typeof(T).Name);
49 }
50 #endregion
51
52 #region 新增操作
53 public bool InsertOne(T entity)
54 {
55 try
56 {
57 GetCollection().InsertOne(entity);
58 return true;
59 }
60 catch (Exception)
61 {
62 return false;
63 }
64 }
65 public async Task<bool> InsertOneAsync(T entity)
66 {
67 try
68 {
69 await GetCollection().InsertOneAsync(entity);
70 return true;
71 }
72 catch (Exception)
73 {
74 return false;
75 }
76 }
77 public bool InsertMany(IEnumerable<T> entity)
78 {
79 try
80 {
81 GetCollection().InsertMany(entity);
82 return true;
83 }
84 catch (Exception)
85 {
86 return false;
87 }
88 }
89 public async Task<bool> InsertManyAsync(IEnumerable<T> entity)
90 {
91 try
92 {
93 await GetCollection().InsertManyAsync(entity);
94 return true;
95 }
96 catch (Exception)
97 {
98 return false;
99 }
100 }
101 #endregion
102
103 #region 查询
104 public T FindOneByFunc(Expression<Func<T, bool>> func)
105 {
106 FilterDefinition<T> filter = new FilterDefinitionBuilder<T>().Where(func);
107 var find = GetCollection().Find<T>(filter);
108 return find.FirstOrDefault();
109 }
110 public async Task<T> FindOneByFuncAsync(Expression<Func<T, bool>> func)
111 {
112 FilterDefinition<T> filter = new FilterDefinitionBuilder<T>().Where(func);
113 var find = await GetCollection().FindAsync<T>(filter);
114 return find.FirstOrDefault();
115 }
116 public IEnumerable<T> FindList(Expression<Func<T, bool>> func)
117 {
118 FilterDefinition<T> filter = new FilterDefinitionBuilder<T>().Where(func);
119 var find = GetCollection().Find<T>(filter);
120 return find.ToList();
121 }
122 public async Task<IEnumerable<T>> FindListAsync(Expression<Func<T, bool>> func)
123 {
124 FilterDefinition<T> filter = new FilterDefinitionBuilder<T>().Where(func);
125 var find = await GetCollection().FindAsync<T>(filter);
126 return find.ToList();
127 }
128
129
130 public async Task<PageData> FindListByPagenationwithOrderAsyn(Expression<Func<T, bool>> where, bool orderAscTrue, Expression<Func<T, object>> OrderBy, int pageIndex = 1, int pageSize = 20)
131 {
132 PageData pd = new PageData();
133 await Task.Factory.StartNew(() =>
134 {
135 pd.pageSize = pageSize;
136 pd.index = pageIndex;
137 int skip = (pageIndex - 1) * pageSize;
138 int limit = pageSize;
139 IMongoQueryable<T> queable = GetCollection().AsQueryable();
140 if (where != null)
141 {
142 queable = queable.Where(where);
143 }
144 if (orderAscTrue)
145 {
146 queable = queable.OrderBy(OrderBy);
147 }
148 else
149 {
150 queable = queable.OrderByDescending(OrderBy);
151 }
152 pd.totalRows = queable.Count();
153 pd.data = queable.Skip(skip).Take(limit).ToList();
154 });
155 return pd;
156 }
157 public async Task<PageData> FindListByPagenationAsyn(Expression<Func<T, bool>> where, int pageIndex, int pageSize)
158 {
159 PageData pd = new PageData();
160 await Task.Factory.StartNew(() =>
161 {
162 pd.pageSize = pageSize;
163 pd.index = pageIndex;
164 int skip = (pageIndex - 1) * pageSize;
165 int limit = pageSize;
166 IMongoQueryable<T> queable = GetCollection().AsQueryable();
167 if (where != null)
168 {
169 queable = queable.Where(where);
170 }
171 pd.totalRows = queable.Count();
172 pd.data = queable.Skip(skip).Take(limit).ToList();
173 });
174 return pd;
175 }
176
177 /// <summary>
178 /// 根据条件查询
179 /// </summary>
180 /// <typeparam name="T"></typeparam>
181 /// <param name="dics"></param>
182 /// <returns></returns>
183 public async Task<List<T>> QueryList(Dictionary<string, object> dics)
184 {
185 var collection = GetCollection();
186 var query = new QueryDocument(dics);
187 var result = await collection.FindAsync<T>(query);
188 return result.ToList<T>();
189 }
190
191 #endregion
192
193 #region 修改
194 /// <summary>
195 /// 编辑
196 /// </summary>
197 /// <typeparam name="T"></typeparam>
198 /// <param name="entity"></param>
199 /// <param name="id"></param>
200 public void Update(T entity, ObjectId id)
201 {
202 var collection = GetCollection();
203 BsonDocument bsd = BsonExtensionMethods.ToBsonDocument(entity);
204 IMongoQuery query = Query.EQ("_id", id);
205 var filter = query.ToBsonDocument();
206 collection.UpdateOne(filter, new UpdateDocument(bsd));
207 }
208
209 /// <summary>
210 ///
211 /// </summary>
212 /// <typeparam name="T"></typeparam>
213 /// <returns></returns>
214 public bool Update(T entity)
215 {
216 var query = new QueryDocument { { "myid", "F110" } };
217 var updateObj = new UpdateDocument { { "$set", new QueryDocument { { "name", "小张" } } } };
218
219 UpdateResult updateResult = GetCollection().UpdateOne(query, updateObj);
220 return updateResult.ModifiedCount > 0;
221 }
222
223 #endregion
224
225 #region 删除,备份
226 ///// <summary>
227 ///// 删除
228 ///// remark:条件删除
229 ///// </summary>
230 ///// <typeparam name="T"></typeparam>
231 ///// <param name="dics"></param>
232 //public static void Delete<T>(Dictionary<string, object> dics) where T : class, new()
233 //{
234 // var col = GetCollection<T>();
235
236 // var query = new QueryDocument(dics);
237
238 // var result = col.Remove(query);
239 //}
240
241 ///// <summary>
242 ///// 删除
243 ///// remark:根据ObjectId删除
244 ///// </summary>
245 ///// <typeparam name="T"></typeparam>
246 ///// <param name="id"></param>
247 //public static void Delete<T>(ObjectId id) where T : class, new()
248 //{
249 // var col = GetCollection<T>();
250 // IMongoQuery query = Query.EQ("_id", id);
251 // col.Remove(query);
252 //}
253 #endregion
254 }
255 }
WebApi:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; namespace ZRFCoreTestMongoDB.Controllers
{
using ZRFCoreTestMongoDB.Model;
using Microsoft.AspNetCore.Mvc;
using ZRF.IContract;
using ZRF.Models;
[ApiController]
[Route("api/[Controller]")]
public class Test01Controller : ControllerBase
{
private ImongoContract<studentInfo> _server; public Test01Controller(ImongoContract<studentInfo> server)
{
_server = server;
} /// <summary>
/// 批量写入的操作
/// </summary>
/// <returns></returns> [HttpGet, Route("doinsert")]
public async Task<ApiResult> DoInsert()
{
ApiResult result = new ApiResult();
try
{
string[] colorArry = new string[] { "red", "blue", "orager" };
List<studentInfo> studentList = new List<studentInfo>();
for (int i = 0; i < 2000000; i++)
{
studentInfo info = new studentInfo
{
age = new Random().Next(18, 38),
birthday = DateTime.Now.AddYears(-(new Random().Next(12, 30))),
name = "name" + new Random().Next(1000, 9999),
pid = Guid.NewGuid().ToString(),
books = new List<book> {
new book
{
authname="小张"+i,
bid=Guid.NewGuid().ToString(),
bname="bname"+i,
saledate=DateTime.Now.AddYears(-(new Random().Next(1,30))),
saleprice=new Random().Next(15,125)*1.0f,
binfo=new bookpropetity{
bcount=new Random().Next(120,350),
color=colorArry[new Random().Next(0,3)],
heigh=25,
width=18
}
}
}
};
studentList.Add(info);
if (studentList.Count >= 2000)
{
bool flag = await _server.InsertManyAsync(studentList);
studentList.Clear();
}
}
if (studentList.Count > 0)
{
bool flag = await _server.InsertManyAsync(studentList);
}
result.code = statuCode.success;
result.message = "写入成功";
}
catch (Exception ex)
{
result.message = "写入异常+" + ex.Message;
}
return result;
} [HttpGet, Route("DoQueryByPagenation")]
public async Task<ApiResult> DoQuery(int pageIndex = 1, int pageSize = 20)
{
ApiResult result = new ApiResult();
try
{
var pd = await _server.FindListByPagenationAsyn(c => c.books[0].binfo.color=="red", pageIndex, pageSize);
result.data = pd;
result.message = "查询成功";
result.code = statuCode.success;
}
catch (Exception ex)
{
result.message = "查询异常:" + ex.Message;
}
return result;
}
}
}
效果截图:(数据一共批量先写入400百万条,不是太多,写入的速度平均为:12000-15000条的样子,阿里云上面的单核1G最低的那种配置吧)
Core3.1WebApi使用MongoDB的更多相关文章
- 【朝夕Net社区技术专刊】Core3.1 WebApi集群实战专题---WebApi环境搭建运行发布部署篇
欢迎大家阅读<朝夕Net社区技术专刊>第1期 原文是我在知乎发表的,现在在这里分享! 我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为首 ...
- 在.NET Core中使用MongoDB明细教程(1):驱动基础及文档插入
MongoDB,被归类为NoSQL数据库,是一个以类JSON格式存储数据的面向文档的数据库系统.MongoDB在底层以名为bson的二进制编码格式表示JSON文档,MongoDB bson实现是轻量级 ...
- 在.NET Core中使用MongoDB明细教程(2):使用Filter语句检索文档
在上篇文章我们介绍了一些驱动程序相关的基础知识,以及如何将文档插入到集合中.在这篇文章中,我们将学习如何从数据库中检索文档. 作者:依乐祝 译文地址:https://www.cnblogs.com/y ...
- 怎么在.NetCore3.0 中使用Log4net 写日志 及读取配置文件的信息
1:安装Log4Net的 NuGet 包: 我们通常之需要安装这一个包即可,其他的主包会自动被添加进来: insatll-package Microsoft.Extensions.Logging.L ...
- spring MVC 整合mongodb
Spring Mongodb 目录 1 SPRING整合MONGODB 1 1.1 环境准备 1 1.2 包依赖 1 1.3 配置 2 2 案列 5 2.1 SPRING MVC整合MONGODB代码 ...
- 【翻译】MongoDB指南/聚合——聚合管道
[原文地址]https://docs.mongodb.com/manual/ 聚合 聚合操作处理数据记录并返回计算后的结果.聚合操作将多个文档分组,并能对已分组的数据执行一系列操作而返回单一结果.Mo ...
- 【翻译】MongoDB指南/CRUD操作(四)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(四) 1 查询方案(Query Plans) MongoDB 查询优化程序处理查询并且针对给定可利用的索引选 ...
- 【翻译】MongoDB指南/CRUD操作(三)
[原文地址]https://docs.mongodb.com/manual/ CRUD操作(三) 主要内容: 原子性和事务(Atomicity and Transactions),读隔离.一致性和新近 ...
- 【翻译】MongoDB指南/CRUD操作(二)
[原文地址]https://docs.mongodb.com/manual/ MongoDB CRUD操作(二) 主要内容: 更新文档,删除文档,批量写操作,SQL与MongoDB映射图,读隔离(读关 ...
随机推荐
- POJ1944
poj1944 一道我不会做的贪心题. (思维才是OI的重点) 但是if您也不会,那就来听我瞎扯吧. 首先,这个图是一个圈,只能连接邻点,使所有求的点联通. 我们先不考虑环,那么就可以想出一个假的做法 ...
- Tbase读写分离与分库分表
一.读写分离 1.1 what 读写分离 读写分离,基本的原理是让主数据库处理事务性增.改.删操作(INSERT.UPDATE.DELETE),而从数据库处理SELECT查询操作.数据库复制被用来把事 ...
- Querydsl与SpringBoot集成
Querydsl为大多数数据库提供了一种基于Java的类型安全,类SQL的查询方式.相比JPA,Querydsl能提供更加强大的查询方式,比如关联查询.相比MyBatis,Querydsl省去了XML ...
- Maven国内仓库
由于国外的官方Maven仓库比较慢,所以寻找国内的代理仓库. 网上找了一些博客,内容都是一模一样,并且不贴代理官方的说明. 我在阿里云的Maven仓库找到了官方说明. 下面直接贴配置指南: 配置指南 ...
- layui 页面加载完成后ajax重新为 html 赋值 遇到的坑
页面加载完毕后,通过 ajax 按照返回值,为部分 html 赋值: $(function(){ ..... }) 直接这样写,报错,$ 没有定义什么的,错位原因为 jquery 引入错误. layu ...
- H5页面怎么跳转到公众号主页?看过来
前言: 做公众号开发的小伙伴,可能会遇到这种需求: 在一个H5页面点击一个关注公众号按钮跳转到公众号主页. 听到这个需求的一瞬间,疑惑了!这不可能! 摸了摸高亮的额头!没办法,做还是要做的 开始上解决 ...
- Apache ActiveMQ(cve-2015-5254)
影响版本 Apache ActiveMQ 5.13.0之前5.x版本中存在安全漏洞 复现 使用工具执行命令 工具地址 https://github.com/matthiaskaiser/jmet/re ...
- QT-可拖拽可编辑的多控件ListView
目标 结合前面的2篇文章, 继续升级QML版本的ListView: 又要拖拽, 又要可编辑, 还得支持多个控件. 循序渐进 本文基于前一篇的基础: Qt-可编辑的ListView 要循序渐进的学习. ...
- Hybrid接口
目录 一.Hybrid接口 1.1 VLan的基本概念 1.2 Hybrid接口特点 1.3 Hybrid接口工作原理 1.4 Hybrid配置 一.Hybrid接口 1.1 VLan的基本概念 特点 ...
- Bugku-你必须让他停下来
这道题使用burpsuite抓包就能做,一开始抓包发到repeater之后flag不一定可以直接得到,原因是flag藏在特定的那张图片后面,我们一直go到那张图片便可以得到flag. 进入题目给的网址 ...