MongoDbClient.cs 46 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180
  1. using System;
  2. using System.Collections.Concurrent;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Linq.Expressions;
  6. using System.Runtime.Remoting.Messaging;
  7. using System.Threading.Tasks;
  8. using Masuit.Tools.Systems;
  9. using MongoDB.Bson;
  10. using MongoDB.Driver;
  11. namespace Masuit.Tools.NoSQL.MongoDBClient
  12. {
  13. public class MongoDbClient
  14. {
  15. public MongoClient Client { get; set; }
  16. public IMongoDatabase Database { get; set; }
  17. private static ConcurrentDictionary<string, MongoDbClient> InstancePool { get; set; } = new ConcurrentDictionary<string, MongoDbClient>();
  18. private static ConcurrentDictionary<string, ConcurrentLimitedQueue<MongoDbClient>> InstanceQueue { get; set; } = new ConcurrentDictionary<string, ConcurrentLimitedQueue<MongoDbClient>>();
  19. private MongoDbClient(string url, string database)
  20. {
  21. Client = new MongoClient(url);
  22. Database = Client.GetDatabase(database);
  23. }
  24. private MongoDbClient(MongoClientSettings settings, string database)
  25. {
  26. Client = new MongoClient(settings);
  27. Database = Client.GetDatabase(database);
  28. }
  29. /// <summary>
  30. /// 获取mongo单例
  31. /// </summary>
  32. /// <param name="url">连接字符串</param>
  33. /// <param name="database">数据库</param>
  34. /// <returns></returns>
  35. public static MongoDbClient GetInstance(string url, string database)
  36. {
  37. InstancePool.TryGetValue(url + database, out var instance);
  38. if (instance is null)
  39. {
  40. instance = new MongoDbClient(url, database);
  41. InstancePool.TryAdd(url + database, instance);
  42. }
  43. return instance;
  44. }
  45. /// <summary>
  46. /// 获取mongo线程内唯一对象
  47. /// </summary>
  48. /// <param name="url">连接字符串</param>
  49. /// <param name="database">数据库</param>
  50. /// <returns></returns>
  51. public static MongoDbClient ThreadLocalInstance(string url, string database)
  52. {
  53. var queue = InstanceQueue.GetOrAdd(url + database, new ConcurrentLimitedQueue<MongoDbClient>(32));
  54. if (queue.IsEmpty)
  55. {
  56. Parallel.For(0, queue.Limit, i =>
  57. {
  58. queue.Enqueue(new MongoDbClient(url, database));
  59. });
  60. }
  61. MongoDbClient instance;
  62. if (CallContext.GetData(url + database) == null)
  63. {
  64. queue.TryDequeue(out instance);
  65. CallContext.SetData(url + database, instance);
  66. }
  67. instance = (MongoDbClient)CallContext.GetData(url + database);
  68. return instance;
  69. }
  70. /// <summary>
  71. /// 获取表
  72. /// </summary>
  73. /// <typeparam name="T"></typeparam>
  74. /// <param name="collection">表名</param>
  75. /// <returns></returns>
  76. public IMongoCollection<T> GetCollection<T>(string collection)
  77. {
  78. return Database.GetCollection<T>(collection);
  79. }
  80. #region 插入
  81. /// <summary>
  82. /// 插入一条数据
  83. /// </summary>
  84. /// <typeparam name="T"></typeparam>
  85. /// <param name="collection">表名</param>
  86. /// <param name="t">数据</param>
  87. public void InsertOne<T>(string collection, T t)
  88. {
  89. Database.GetCollection<T>(collection).InsertOne(t);
  90. }
  91. /// <summary>
  92. /// 插入一条数据
  93. /// </summary>
  94. /// <param name="collection">表名</param>
  95. /// <param name="doc">文档</param>
  96. public void InsertOne(string collection, BsonDocument doc)
  97. {
  98. Database.GetCollection<BsonDocument>(collection).InsertOne(doc);
  99. }
  100. /// <summary>
  101. /// 插入一条数据
  102. /// </summary>
  103. /// <typeparam name="T"></typeparam>
  104. /// <param name="collection">表名</param>
  105. /// <param name="t">数据</param>
  106. public void InsertOneAsync<T>(string collection, T t)
  107. {
  108. Database.GetCollection<T>(collection).InsertOneAsync(t);
  109. }
  110. /// <summary>
  111. /// 插入一条数据
  112. /// </summary>
  113. /// <param name="collection">表名</param>
  114. /// <param name="doc">文档</param>
  115. public void InsertOneAsync(string collection, BsonDocument doc)
  116. {
  117. Database.GetCollection<BsonDocument>(collection).InsertOneAsync(doc);
  118. }
  119. /// <summary>
  120. /// 插入多条数据
  121. /// </summary>
  122. /// <typeparam name="T"></typeparam>
  123. /// <param name="collection">表名</param>
  124. /// <param name="list">集合</param>
  125. public void InsertMany<T>(string collection, IEnumerable<T> list)
  126. {
  127. Database.GetCollection<T>(collection).InsertMany(list);
  128. }
  129. /// <summary>
  130. /// 插入多条数据
  131. /// </summary>
  132. /// <param name="collection">表名</param>
  133. /// <param name="list">Bson集合</param>
  134. public void InsertMany(string collection, IEnumerable<BsonDocument> list)
  135. {
  136. Database.GetCollection<BsonDocument>(collection).InsertMany(list);
  137. }
  138. /// <summary>
  139. /// 插入多条数据
  140. /// </summary>
  141. /// <typeparam name="T"></typeparam>
  142. /// <param name="collection">表名</param>
  143. /// <param name="list">集合</param>
  144. public void InsertManyAsync<T>(string collection, IEnumerable<T> list)
  145. {
  146. Database.GetCollection<T>(collection).InsertManyAsync(list);
  147. }
  148. /// <summary>
  149. /// 插入多条数据
  150. /// </summary>
  151. /// <param name="collection">表名</param>
  152. /// <param name="list">Bson集合</param>
  153. public void InsertManyAsync(string collection, IEnumerable<BsonDocument> list)
  154. {
  155. Database.GetCollection<BsonDocument>(collection).InsertManyAsync(list);
  156. }
  157. /// <summary>
  158. /// 大批量插入数据
  159. /// </summary>
  160. /// <typeparam name="T"></typeparam>
  161. /// <param name="collection">表名</param>
  162. /// <param name="list">数据集合</param>
  163. /// <returns></returns>
  164. public List<WriteModel<T>> BulkInsert<T>(string collection, IEnumerable<WriteModel<T>> list)
  165. {
  166. BulkWriteResult<T> result = Database.GetCollection<T>(collection).BulkWrite(list);
  167. return result.ProcessedRequests.ToList();
  168. }
  169. /// <summary>
  170. /// 大批量插入数据
  171. /// </summary>
  172. /// <param name="collection">表名</param>
  173. /// <param name="list">Bson数据集合</param>
  174. /// <returns></returns>
  175. public List<WriteModel<BsonDocument>> BulkInsert(string collection, IEnumerable<WriteModel<BsonDocument>> list)
  176. {
  177. BulkWriteResult<BsonDocument> result = Database.GetCollection<BsonDocument>(collection).BulkWrite(list);
  178. return result.ProcessedRequests.ToList();
  179. }
  180. /// <summary>
  181. /// 大批量插入数据
  182. /// </summary>
  183. /// <typeparam name="T"></typeparam>
  184. /// <param name="collection">表名</param>
  185. /// <param name="list">数据集合</param>
  186. /// <returns></returns>
  187. public async Task<List<WriteModel<T>>> BulkInsertAsync<T>(string collection, IEnumerable<WriteModel<T>> list)
  188. {
  189. BulkWriteResult<T> result = await Database.GetCollection<T>(collection).BulkWriteAsync(list);
  190. return result.ProcessedRequests.ToList();
  191. }
  192. /// <summary>
  193. /// 大批量插入数据
  194. /// </summary>
  195. /// <param name="collection">表名</param>
  196. /// <param name="list">Bson数据集合</param>
  197. /// <returns></returns>
  198. public async Task<List<WriteModel<BsonDocument>>> BulkInsertAsync(string collection, IEnumerable<WriteModel<BsonDocument>> list)
  199. {
  200. BulkWriteResult<BsonDocument> result = await Database.GetCollection<BsonDocument>(collection).BulkWriteAsync(list);
  201. return result.ProcessedRequests.ToList();
  202. }
  203. #endregion
  204. #region 更新
  205. /// <summary>
  206. /// 修改一条数据
  207. /// </summary>
  208. /// <typeparam name="T"></typeparam>
  209. /// <param name="collection">表名</param>
  210. /// <param name="filter">条件</param>
  211. /// <param name="update">更新的数据</param>
  212. /// <param name="upsert">如果它不存在是否插入文档</param>
  213. /// <returns></returns>
  214. public string UpdateOne<T>(string collection, Expression<Func<T, Boolean>> filter, UpdateDefinition<T> update, bool upsert)
  215. {
  216. UpdateResult result = Database.GetCollection<T>(collection).UpdateOne(filter, update, new UpdateOptions() { IsUpsert = upsert });
  217. return result.ToJson();
  218. }
  219. /// <summary>
  220. /// 修改一条数据
  221. /// </summary>
  222. /// <param name="collection">表名</param>
  223. /// <param name="filter">条件</param>
  224. /// <param name="update">更新的数据</param>
  225. /// <param name="upsert">如果它不存在是否插入文档</param>
  226. /// <returns></returns>
  227. public string UpdateOne(string collection, Expression<Func<BsonDocument, Boolean>> filter, UpdateDefinition<BsonDocument> update, bool upsert)
  228. {
  229. UpdateResult result = Database.GetCollection<BsonDocument>(collection).UpdateOne(filter, update, new UpdateOptions() { IsUpsert = upsert });
  230. return result.ToJson();
  231. }
  232. /// <summary>
  233. /// 修改一条数据
  234. /// </summary>
  235. /// <typeparam name="T"></typeparam>
  236. /// <param name="collection">表名</param>
  237. /// <param name="filter">条件</param>
  238. /// <param name="update">更新的数据</param>
  239. /// <param name="upsert">如果它不存在是否插入文档</param>
  240. /// <returns></returns>
  241. public async Task<string> UpdateOneAsync<T>(string collection, Expression<Func<T, Boolean>> filter, UpdateDefinition<T> update, bool upsert)
  242. {
  243. UpdateResult result = await Database.GetCollection<T>(collection).UpdateOneAsync(filter, update, new UpdateOptions() { IsUpsert = upsert });
  244. return result.ToJson();
  245. }
  246. /// <summary>
  247. /// 修改一条数据
  248. /// </summary>
  249. /// <param name="collection">表名</param>
  250. /// <param name="filter">条件</param>
  251. /// <param name="update">更新的数据</param>
  252. /// <param name="upsert">如果它不存在是否插入文档</param>
  253. /// <returns></returns>
  254. public async Task<string> UpdateOneAsync(string collection, Expression<Func<BsonDocument, Boolean>> filter, UpdateDefinition<BsonDocument> update, bool upsert)
  255. {
  256. UpdateResult result = await Database.GetCollection<BsonDocument>(collection).UpdateOneAsync(filter, update, new UpdateOptions() { IsUpsert = upsert });
  257. return result.ToJson();
  258. }
  259. /// <summary>
  260. /// 修改文档
  261. /// </summary>
  262. /// <param name="collName">集合名称</param>
  263. /// <param name="filter">修改条件</param>
  264. /// <param name="update">修改结果</param>
  265. /// <param name="upsert">是否插入新文档(filter条件满足就更新,否则插入新文档)</param>
  266. /// <returns></returns>
  267. public Int64 UpdateMany<T>(String collName, Expression<Func<T, Boolean>> filter, UpdateDefinition<T> update, Boolean upsert = false)
  268. {
  269. UpdateResult result = Database.GetCollection<T>(collName).UpdateMany(filter, update, new UpdateOptions { IsUpsert = upsert });
  270. return result.ModifiedCount;
  271. }
  272. /// <summary>
  273. /// 修改文档
  274. /// </summary>
  275. /// <param name="collName">集合名称</param>
  276. /// <param name="filter">修改条件</param>
  277. /// <param name="update">修改结果</param>
  278. /// <param name="upsert">是否插入新文档(filter条件满足就更新,否则插入新文档)</param>
  279. /// <returns></returns>
  280. public Int64 UpdateMany(String collName, Expression<Func<BsonDocument, Boolean>> filter, UpdateDefinition<BsonDocument> update, Boolean upsert = false)
  281. {
  282. UpdateResult result = Database.GetCollection<BsonDocument>(collName).UpdateMany(filter, update, new UpdateOptions { IsUpsert = upsert });
  283. return result.ModifiedCount;
  284. }
  285. /// <summary>
  286. /// 修改多个文档
  287. /// </summary>
  288. /// <typeparam name="T"></typeparam>
  289. /// <param name="collName">集合名称</param>
  290. /// <param name="filter">修改条件</param>
  291. /// <param name="update">修改结果</param>
  292. /// <param name="upsert">是否插入新文档(filter条件满足就更新,否则插入新文档)</param>
  293. /// <returns></returns>
  294. public async Task<long> UpdateManyAsync<T>(String collName, Expression<Func<T, Boolean>> filter, UpdateDefinition<T> update, Boolean upsert = false)
  295. {
  296. UpdateResult result = await Database.GetCollection<T>(collName).UpdateManyAsync(filter, update, new UpdateOptions { IsUpsert = upsert });
  297. return result.ModifiedCount;
  298. }
  299. /// <summary>
  300. /// 修改多个文档
  301. /// </summary>
  302. /// <param name="collName">集合名称</param>
  303. /// <param name="filter">修改条件</param>
  304. /// <param name="update">修改结果</param>
  305. /// <param name="upsert">是否插入新文档(filter条件满足就更新,否则插入新文档)</param>
  306. /// <returns></returns>
  307. public async Task<long> UpdateManyAsync(String collName, Expression<Func<BsonDocument, Boolean>> filter, UpdateDefinition<BsonDocument> update, Boolean upsert = false)
  308. {
  309. UpdateResult result = await Database.GetCollection<BsonDocument>(collName).UpdateManyAsync(filter, update, new UpdateOptions { IsUpsert = upsert });
  310. return result.ModifiedCount;
  311. }
  312. /// <summary>
  313. /// 修改文档
  314. /// </summary>
  315. /// <typeparam name="T"></typeparam>
  316. /// <param name="collName">表名</param>
  317. /// <param name="filter">条件</param>
  318. /// <param name="update">更新后的数据</param>
  319. /// <returns></returns>
  320. public T UpdateOne<T>(String collName, Expression<Func<T, Boolean>> filter, UpdateDefinition<T> update)
  321. {
  322. T result = Database.GetCollection<T>(collName).FindOneAndUpdate(filter, update);
  323. return result;
  324. }
  325. /// <summary>
  326. /// 修改文档
  327. /// </summary>
  328. /// <param name="collName">表名</param>
  329. /// <param name="filter">条件</param>
  330. /// <param name="update">更新后的Bson数据</param>
  331. /// <returns></returns>
  332. public BsonDocument UpdateOne(String collName, Expression<Func<BsonDocument, Boolean>> filter, UpdateDefinition<BsonDocument> update)
  333. {
  334. BsonDocument result = Database.GetCollection<BsonDocument>(collName).FindOneAndUpdate(filter, update);
  335. return result;
  336. }
  337. /// <summary>
  338. /// 修改文档
  339. /// </summary>
  340. /// <typeparam name="T"></typeparam>
  341. /// <param name="collName">表名</param>
  342. /// <param name="filter">条件</param>
  343. /// <param name="update">更新后的数据</param>
  344. /// <returns></returns>
  345. public async Task<T> UpdateOneAsync<T>(String collName, Expression<Func<T, Boolean>> filter, UpdateDefinition<T> update)
  346. {
  347. T result = await Database.GetCollection<T>(collName).FindOneAndUpdateAsync(filter, update);
  348. return result;
  349. }
  350. /// <summary>
  351. /// 修改文档
  352. /// </summary>
  353. /// <param name="collName">表名</param>
  354. /// <param name="filter">条件</param>
  355. /// <param name="update">更新后的Bson数据</param>
  356. /// <returns></returns>
  357. public async Task<BsonDocument> UpdateOneAsync(String collName, Expression<Func<BsonDocument, Boolean>> filter, UpdateDefinition<BsonDocument> update)
  358. {
  359. BsonDocument result = await Database.GetCollection<BsonDocument>(collName).FindOneAndUpdateAsync(filter, update);
  360. return result;
  361. }
  362. #endregion
  363. #region 删除
  364. /// <summary>
  365. /// 按BsonDocument条件删除
  366. /// </summary>
  367. /// <param name="collection">集合名称</param>
  368. /// <param name="document">文档</param>
  369. /// <returns></returns>
  370. public Int64 Delete<T>(String collection, BsonDocument document)
  371. {
  372. DeleteResult result = Database.GetCollection<T>(collection).DeleteOne(document);
  373. return result.DeletedCount;
  374. }
  375. /// <summary>
  376. /// 按BsonDocument条件删除
  377. /// </summary>
  378. /// <param name="collection">集合名称</param>
  379. /// <param name="document">文档</param>
  380. /// <returns></returns>
  381. public Int64 DeleteMany<T>(String collection, BsonDocument document)
  382. {
  383. DeleteResult result = Database.GetCollection<T>(collection).DeleteMany(document);
  384. return result.DeletedCount;
  385. }
  386. /// <summary>
  387. /// 按BsonDocument条件删除
  388. /// </summary>
  389. /// <param name="collection">集合名称</param>
  390. /// <param name="document">文档</param>
  391. /// <returns></returns>
  392. public Int64 Delete(String collection, BsonDocument document)
  393. {
  394. DeleteResult result = Database.GetCollection<BsonDocument>(collection).DeleteOne(document);
  395. return result.DeletedCount;
  396. }
  397. /// <summary>
  398. /// 按BsonDocument条件删除
  399. /// </summary>
  400. /// <param name="collection">集合名称</param>
  401. /// <param name="document">文档</param>
  402. /// <returns></returns>
  403. public Int64 DeleteMany(String collection, BsonDocument document)
  404. {
  405. DeleteResult result = Database.GetCollection<BsonDocument>(collection).DeleteMany(document);
  406. return result.DeletedCount;
  407. }
  408. /// <summary>
  409. /// 按BsonDocument条件删除
  410. /// </summary>
  411. /// <param name="collection">集合名称</param>
  412. /// <param name="document">文档</param>
  413. /// <returns></returns>
  414. public async Task<long> DeleteAsync<T>(String collection, BsonDocument document)
  415. {
  416. DeleteResult result = await Database.GetCollection<T>(collection).DeleteOneAsync(document);
  417. return result.DeletedCount;
  418. }
  419. /// <summary>
  420. /// 按BsonDocument条件删除
  421. /// </summary>
  422. /// <param name="collection">集合名称</param>
  423. /// <param name="document">文档</param>
  424. /// <returns></returns>
  425. public async Task<long> DeleteManyAsync<T>(String collection, BsonDocument document)
  426. {
  427. DeleteResult result = await Database.GetCollection<T>(collection).DeleteManyAsync(document);
  428. return result.DeletedCount;
  429. }
  430. /// <summary>
  431. /// 按BsonDocument条件删除
  432. /// </summary>
  433. /// <param name="collection">集合名称</param>
  434. /// <param name="document">文档</param>
  435. /// <returns></returns>
  436. public async Task<long> DeleteAsync(String collection, BsonDocument document)
  437. {
  438. DeleteResult result = await Database.GetCollection<BsonDocument>(collection).DeleteOneAsync(document);
  439. return result.DeletedCount;
  440. }
  441. /// <summary>
  442. /// 按BsonDocument条件删除
  443. /// </summary>
  444. /// <param name="collection">集合名称</param>
  445. /// <param name="document">文档</param>
  446. /// <returns></returns>
  447. public async Task<long> DeleteManyAsync(String collection, BsonDocument document)
  448. {
  449. DeleteResult result = await Database.GetCollection<BsonDocument>(collection).DeleteManyAsync(document);
  450. return result.DeletedCount;
  451. }
  452. /// <summary>
  453. /// 按json字符串删除
  454. /// </summary>
  455. /// <param name="collName">集合名称</param>
  456. /// <param name="json">json字符串</param>
  457. /// <returns></returns>
  458. public Int64 Delete<T>(String collName, String json)
  459. {
  460. var result = Database.GetCollection<T>(collName).DeleteOne(json);
  461. return result.DeletedCount;
  462. }
  463. /// <summary>
  464. /// 按json字符串删除
  465. /// </summary>
  466. /// <param name="collName">集合名称</param>
  467. /// <param name="json">json字符串</param>
  468. /// <returns></returns>
  469. public Int64 DeleteMany<T>(String collName, String json)
  470. {
  471. var result = Database.GetCollection<T>(collName).DeleteMany(json);
  472. return result.DeletedCount;
  473. }
  474. /// <summary>
  475. /// 按json字符串删除
  476. /// </summary>
  477. /// <param name="collName">集合名称</param>
  478. /// <param name="json">json字符串</param>
  479. /// <returns></returns>
  480. public Int64 Delete(String collName, String json)
  481. {
  482. var result = Database.GetCollection<BsonDocument>(collName).DeleteOne(json);
  483. return result.DeletedCount;
  484. }
  485. /// <summary>
  486. /// 按json字符串删除
  487. /// </summary>
  488. /// <param name="collName">集合名称</param>
  489. /// <param name="json">json字符串</param>
  490. /// <returns></returns>
  491. public Int64 DeleteMany(String collName, String json)
  492. {
  493. var result = Database.GetCollection<BsonDocument>(collName).DeleteMany(json);
  494. return result.DeletedCount;
  495. }
  496. /// <summary>
  497. /// 按json字符串删除
  498. /// </summary>
  499. /// <param name="collName">集合名称</param>
  500. /// <param name="json">json字符串</param>
  501. /// <returns></returns>
  502. public async Task<long> DeleteAsync<T>(String collName, String json)
  503. {
  504. var result = await Database.GetCollection<T>(collName).DeleteOneAsync(json);
  505. return result.DeletedCount;
  506. }
  507. /// <summary>
  508. /// 按json字符串删除
  509. /// </summary>
  510. /// <param name="collName">集合名称</param>
  511. /// <param name="json">json字符串</param>
  512. /// <returns></returns>
  513. public async Task<long> DeleteManyAsync<T>(String collName, String json)
  514. {
  515. var result = await Database.GetCollection<T>(collName).DeleteManyAsync(json);
  516. return result.DeletedCount;
  517. }
  518. /// <summary>
  519. /// 按json字符串删除
  520. /// </summary>
  521. /// <param name="collName">集合名称</param>
  522. /// <param name="json">json字符串</param>
  523. /// <returns></returns>
  524. public async Task<long> DeleteAsync(String collName, String json)
  525. {
  526. var result = await Database.GetCollection<BsonDocument>(collName).DeleteOneAsync(json);
  527. return result.DeletedCount;
  528. }
  529. /// <summary>
  530. /// 按json字符串删除
  531. /// </summary>
  532. /// <param name="collName">集合名称</param>
  533. /// <param name="json">json字符串</param>
  534. /// <returns></returns>
  535. public async Task<long> DeleteManyAsync(String collName, String json)
  536. {
  537. var result = await Database.GetCollection<BsonDocument>(collName).DeleteManyAsync(json);
  538. return result.DeletedCount;
  539. }
  540. /// <summary>
  541. /// 按条件表达式删除
  542. /// </summary>
  543. /// <param name="collName">集合名称</param>
  544. /// <param name="predicate">条件表达式</param>
  545. /// <returns></returns>
  546. public Int64 Delete<T>(String collName, Expression<Func<T, Boolean>> predicate)
  547. {
  548. var result = Database.GetCollection<T>(collName).DeleteOne(predicate);
  549. return result.DeletedCount;
  550. }
  551. /// <summary>
  552. /// 按条件表达式删除
  553. /// </summary>
  554. /// <param name="collName">集合名称</param>
  555. /// <param name="predicate">条件表达式</param>
  556. /// <returns></returns>
  557. public Int64 DeleteMany<T>(String collName, Expression<Func<T, Boolean>> predicate)
  558. {
  559. var result = Database.GetCollection<T>(collName).DeleteMany(predicate);
  560. return result.DeletedCount;
  561. }
  562. /// <summary>
  563. /// 按条件表达式删除
  564. /// </summary>
  565. /// <param name="collName">集合名称</param>
  566. /// <param name="predicate">条件表达式</param>
  567. /// <returns></returns>
  568. public Int64 Delete(String collName, Expression<Func<BsonDocument, Boolean>> predicate)
  569. {
  570. var result = Database.GetCollection<BsonDocument>(collName).DeleteOne(predicate);
  571. return result.DeletedCount;
  572. }
  573. /// <summary>
  574. /// 按条件表达式删除
  575. /// </summary>
  576. /// <param name="collName">集合名称</param>
  577. /// <param name="predicate">条件表达式</param>
  578. /// <returns></returns>
  579. public Int64 DeleteMany(String collName, Expression<Func<BsonDocument, Boolean>> predicate)
  580. {
  581. var result = Database.GetCollection<BsonDocument>(collName).DeleteMany(predicate);
  582. return result.DeletedCount;
  583. }
  584. /// <summary>
  585. /// 按条件表达式删除
  586. /// </summary>
  587. /// <param name="collName">集合名称</param>
  588. /// <param name="predicate">条件表达式</param>
  589. /// <returns></returns>
  590. public async Task<long> DeleteAsync<T>(String collName, Expression<Func<T, Boolean>> predicate)
  591. {
  592. var result = await Database.GetCollection<T>(collName).DeleteOneAsync(predicate);
  593. return result.DeletedCount;
  594. }
  595. /// <summary>
  596. /// 按条件表达式删除
  597. /// </summary>
  598. /// <param name="collName">集合名称</param>
  599. /// <param name="predicate">条件表达式</param>
  600. /// <returns></returns>
  601. public async Task<long> DeleteManyAsync<T>(String collName, Expression<Func<T, Boolean>> predicate)
  602. {
  603. var result = await Database.GetCollection<T>(collName).DeleteManyAsync(predicate);
  604. return result.DeletedCount;
  605. }
  606. /// <summary>
  607. /// 按条件表达式删除
  608. /// </summary>
  609. /// <param name="collName">集合名称</param>
  610. /// <param name="predicate">条件表达式</param>
  611. /// <returns></returns>
  612. public async Task<long> DeleteAsync(String collName, Expression<Func<BsonDocument, Boolean>> predicate)
  613. {
  614. var result = await Database.GetCollection<BsonDocument>(collName).DeleteOneAsync(predicate);
  615. return result.DeletedCount;
  616. }
  617. /// <summary>
  618. /// 按条件表达式删除
  619. /// </summary>
  620. /// <param name="collName">集合名称</param>
  621. /// <param name="predicate">条件表达式</param>
  622. /// <returns></returns>
  623. public async Task<long> DeleteManyAsync(String collName, Expression<Func<BsonDocument, Boolean>> predicate)
  624. {
  625. var result = await Database.GetCollection<BsonDocument>(collName).DeleteManyAsync(predicate);
  626. return result.DeletedCount;
  627. }
  628. /// <summary>
  629. /// 按检索条件删除
  630. /// 建议用Builders&lt;T&gt;构建复杂的查询条件
  631. /// </summary>
  632. /// <param name="collName">集合名称</param>
  633. /// <param name="filter">条件</param>
  634. /// <returns></returns>
  635. public Int64 Delete<T>(String collName, FilterDefinition<T> filter)
  636. {
  637. var result = Database.GetCollection<T>(collName).DeleteOne(filter);
  638. return result.DeletedCount;
  639. }
  640. /// <summary>
  641. /// 按检索条件删除
  642. /// 建议用Builders&lt;T&gt;构建复杂的查询条件
  643. /// </summary>
  644. /// <param name="collName">集合名称</param>
  645. /// <param name="filter">条件</param>
  646. /// <returns></returns>
  647. public Int64 DeleteMany<T>(String collName, FilterDefinition<T> filter)
  648. {
  649. var result = Database.GetCollection<T>(collName).DeleteMany(filter);
  650. return result.DeletedCount;
  651. }
  652. /// <summary>
  653. /// 按检索条件删除
  654. /// 建议用Builders&lt;T&gt;构建复杂的查询条件
  655. /// </summary>
  656. /// <param name="collName">集合名称</param>
  657. /// <param name="filter">条件</param>
  658. /// <returns></returns>
  659. public Int64 Delete(String collName, FilterDefinition<BsonDocument> filter)
  660. {
  661. var result = Database.GetCollection<BsonDocument>(collName).DeleteOne(filter);
  662. return result.DeletedCount;
  663. }
  664. /// <summary>
  665. /// 按检索条件删除
  666. /// 建议用Builders&lt;T&gt;构建复杂的查询条件
  667. /// </summary>
  668. /// <param name="collName">集合名称</param>
  669. /// <param name="filter">条件</param>
  670. /// <returns></returns>
  671. public Int64 DeleteMany(String collName, FilterDefinition<BsonDocument> filter)
  672. {
  673. var result = Database.GetCollection<BsonDocument>(collName).DeleteMany(filter);
  674. return result.DeletedCount;
  675. }
  676. /// <summary>
  677. /// 按检索条件删除
  678. /// 建议用Builders&lt;T&gt;构建复杂的查询条件
  679. /// </summary>
  680. /// <param name="collName">集合名称</param>
  681. /// <param name="filter">条件</param>
  682. /// <returns></returns>
  683. public async Task<long> DeleteAsync<T>(String collName, FilterDefinition<T> filter)
  684. {
  685. var result = await Database.GetCollection<T>(collName).DeleteOneAsync(filter);
  686. return result.DeletedCount;
  687. }
  688. /// <summary>
  689. /// 按检索条件删除
  690. /// 建议用Builders&lt;T&gt;构建复杂的查询条件
  691. /// </summary>
  692. /// <param name="collName">集合名称</param>
  693. /// <param name="filter">条件</param>
  694. /// <returns></returns>
  695. public async Task<long> DeleteManyAsync<T>(String collName, FilterDefinition<T> filter)
  696. {
  697. var result = await Database.GetCollection<T>(collName).DeleteManyAsync(filter);
  698. return result.DeletedCount;
  699. }
  700. /// <summary>
  701. /// 按检索条件删除
  702. /// 建议用Builders&lt;T&gt;构建复杂的查询条件
  703. /// </summary>
  704. /// <param name="collName">集合名称</param>
  705. /// <param name="filter">条件</param>
  706. /// <returns></returns>
  707. public async Task<long> DeleteAsync(String collName, FilterDefinition<BsonDocument> filter)
  708. {
  709. var result = await Database.GetCollection<BsonDocument>(collName).DeleteOneAsync(filter);
  710. return result.DeletedCount;
  711. }
  712. /// <summary>
  713. /// 按检索条件删除
  714. /// 建议用Builders&lt;T&gt;构建复杂的查询条件
  715. /// </summary>
  716. /// <param name="collName">集合名称</param>
  717. /// <param name="filter">条件</param>
  718. /// <returns></returns>
  719. public async Task<long> DeleteManyAsync(String collName, FilterDefinition<BsonDocument> filter)
  720. {
  721. var result = await Database.GetCollection<BsonDocument>(collName).DeleteManyAsync(filter);
  722. return result.DeletedCount;
  723. }
  724. /// <summary>
  725. /// 删除一条记录
  726. /// </summary>
  727. /// <typeparam name="T"></typeparam>
  728. /// <param name="collName">表名</param>
  729. /// <param name="filter">条件</param>
  730. /// <returns></returns>
  731. public T DeleteOne<T>(String collName, Expression<Func<T, Boolean>> filter)
  732. {
  733. T result = Database.GetCollection<T>(collName).FindOneAndDelete(filter);
  734. return result;
  735. }
  736. /// <summary>
  737. /// 删除一条记录
  738. /// </summary>
  739. /// <param name="collName">表名</param>
  740. /// <param name="filter">条件</param>
  741. /// <returns></returns>
  742. public BsonDocument DeleteOne(String collName, Expression<Func<BsonDocument, Boolean>> filter)
  743. {
  744. BsonDocument result = Database.GetCollection<BsonDocument>(collName).FindOneAndDelete(filter);
  745. return result;
  746. }
  747. /// <summary>
  748. /// 删除一条记录
  749. /// </summary>
  750. /// <typeparam name="T"></typeparam>
  751. /// <param name="collName">表名</param>
  752. /// <param name="filter">条件</param>
  753. /// <returns></returns>
  754. public async Task<T> DeleteOneAsync<T>(String collName, Expression<Func<T, Boolean>> filter)
  755. {
  756. T result = await Database.GetCollection<T>(collName).FindOneAndDeleteAsync(filter);
  757. return result;
  758. }
  759. /// <summary>
  760. /// 删除一条记录
  761. /// </summary>
  762. /// <param name="collName">表名</param>
  763. /// <param name="filter">条件</param>
  764. /// <returns></returns>
  765. public async Task<BsonDocument> DeleteOneAsync(String collName, Expression<Func<BsonDocument, Boolean>> filter)
  766. {
  767. BsonDocument result = await Database.GetCollection<BsonDocument>(collName).FindOneAndDeleteAsync(filter);
  768. return result;
  769. }
  770. #endregion
  771. #region 查询
  772. /// <summary>
  773. /// 查询,复杂查询直接用Linq处理
  774. /// </summary>
  775. /// <param name="collName">集合名称</param>
  776. /// <returns>要查询的对象</returns>
  777. public IQueryable<T> GetQueryable<T>(String collName)
  778. {
  779. return Database.GetCollection<T>(collName).AsQueryable();
  780. }
  781. /// <summary>
  782. /// 查询,复杂查询直接用Linq处理
  783. /// </summary>
  784. /// <param name="collName">集合名称</param>
  785. /// <returns>要查询的对象</returns>
  786. public IQueryable<BsonDocument> GetQueryable(String collName)
  787. {
  788. return Database.GetCollection<BsonDocument>(collName).AsQueryable();
  789. }
  790. /// <summary>
  791. /// 获取一条数据
  792. /// </summary>
  793. /// <typeparam name="T"></typeparam>
  794. /// <param name="collName">表名</param>
  795. /// <param name="filter">条件</param>
  796. /// <returns></returns>
  797. public T Get<T>(String collName, FilterDefinition<T> filter)
  798. {
  799. IFindFluent<T, T> find = Database.GetCollection<T>(collName).Find(filter);
  800. return find.FirstOrDefault();
  801. }
  802. /// <summary>
  803. /// 获取一条数据
  804. /// </summary>
  805. /// <param name="collName">表名</param>
  806. /// <param name="filter">条件</param>
  807. /// <returns></returns>
  808. public BsonDocument Get(String collName, FilterDefinition<BsonDocument> filter)
  809. {
  810. IFindFluent<BsonDocument, BsonDocument> find = Database.GetCollection<BsonDocument>(collName).Find(filter);
  811. return find.FirstOrDefault();
  812. }
  813. /// <summary>
  814. /// 获取一条数据
  815. /// </summary>
  816. /// <typeparam name="T"></typeparam>
  817. /// <param name="collName">表名</param>
  818. /// <param name="filter">条件</param>
  819. /// <returns></returns>
  820. public async Task<T> GetAsync<T>(String collName, FilterDefinition<T> filter)
  821. {
  822. IAsyncCursor<T> find = await Database.GetCollection<T>(collName).FindAsync(filter);
  823. return await find.FirstOrDefaultAsync();
  824. }
  825. /// <summary>
  826. /// 获取一条数据
  827. /// </summary>
  828. /// <param name="collName">表名</param>
  829. /// <param name="filter">条件</param>
  830. /// <returns></returns>
  831. public async Task<BsonDocument> GetAsync(String collName, FilterDefinition<BsonDocument> filter)
  832. {
  833. IAsyncCursor<BsonDocument> find = await Database.GetCollection<BsonDocument>(collName).FindAsync(filter);
  834. return await find.FirstOrDefaultAsync();
  835. }
  836. /// <summary>
  837. /// 获取多条数据
  838. /// </summary>
  839. /// <typeparam name="T"></typeparam>
  840. /// <param name="collName">表名</param>
  841. /// <param name="filter">条件</param>
  842. /// <returns></returns>
  843. public IEnumerable<T> GetMany<T>(String collName, FilterDefinition<T> filter)
  844. {
  845. IFindFluent<T, T> find = Database.GetCollection<T>(collName).Find(filter);
  846. return find.ToEnumerable();
  847. }
  848. /// <summary>
  849. /// 获取多条数据
  850. /// </summary>
  851. /// <param name="collName">表名</param>
  852. /// <param name="filter">条件</param>
  853. /// <returns></returns>
  854. public IEnumerable<BsonDocument> GetMany(String collName, FilterDefinition<BsonDocument> filter)
  855. {
  856. IFindFluent<BsonDocument, BsonDocument> find = Database.GetCollection<BsonDocument>(collName).Find(filter);
  857. return find.ToEnumerable();
  858. }
  859. /// <summary>
  860. /// 获取多条数据
  861. /// </summary>
  862. /// <typeparam name="T"></typeparam>
  863. /// <param name="collName">表名</param>
  864. /// <param name="filter">条件</param>
  865. /// <returns></returns>
  866. public async Task<IEnumerable<T>> GetManyAsync<T>(String collName, FilterDefinition<T> filter)
  867. {
  868. IAsyncCursor<T> find = await Database.GetCollection<T>(collName).FindAsync(filter);
  869. return find.ToEnumerable();
  870. }
  871. /// <summary>
  872. /// 获取多条数据
  873. /// </summary>
  874. /// <param name="collName">表名</param>
  875. /// <param name="filter">条件</param>
  876. /// <returns></returns>
  877. public async Task<IEnumerable<BsonDocument>> GetManyAsync(String collName, FilterDefinition<BsonDocument> filter)
  878. {
  879. IAsyncCursor<BsonDocument> find = await Database.GetCollection<BsonDocument>(collName).FindAsync(filter);
  880. return find.ToEnumerable();
  881. }
  882. /// <summary>
  883. /// 判断是否存在符合条件的数据
  884. /// </summary>
  885. /// <typeparam name="T"></typeparam>
  886. /// <param name="collName">表名</param>
  887. /// <param name="filter">条件</param>
  888. /// <returns></returns>
  889. public bool Any<T>(String collName, FilterDefinition<T> filter)
  890. {
  891. IFindFluent<T, T> find = Database.GetCollection<T>(collName).Find(filter);
  892. return find.Any();
  893. }
  894. /// <summary>
  895. /// 判断是否存在符合条件的数据
  896. /// </summary>
  897. /// <param name="collName">表名</param>
  898. /// <param name="filter">条件</param>
  899. /// <returns></returns>
  900. public bool Any(String collName, FilterDefinition<BsonDocument> filter)
  901. {
  902. IFindFluent<BsonDocument, BsonDocument> find = Database.GetCollection<BsonDocument>(collName).Find(filter);
  903. return find.Any();
  904. }
  905. /// <summary>
  906. /// 判断是否存在符合条件的数据
  907. /// </summary>
  908. /// <param name="collName">表名</param>
  909. /// <param name="filter">条件</param>
  910. /// <returns></returns>
  911. public async Task<bool> AnyAsync<T>(String collName, FilterDefinition<T> filter)
  912. {
  913. IAsyncCursor<T> find = await Database.GetCollection<T>(collName).FindAsync(filter);
  914. return await find.AnyAsync();
  915. }
  916. /// <summary>
  917. /// 判断是否存在符合条件的数据
  918. /// </summary>
  919. /// <param name="collName">表名</param>
  920. /// <param name="filter">条件</param>
  921. /// <returns></returns>
  922. public async Task<bool> AnyAsync(String collName, FilterDefinition<BsonDocument> filter)
  923. {
  924. IAsyncCursor<BsonDocument> find = await Database.GetCollection<BsonDocument>(collName).FindAsync(filter);
  925. return await find.AnyAsync();
  926. }
  927. #endregion
  928. #region 索引
  929. /// <summary>
  930. /// 创建索引
  931. /// </summary>
  932. /// <param name="collection">集合名</param>
  933. /// <param name="index">索引键</param>
  934. /// <param name="asc"></param>
  935. /// <returns></returns>
  936. public string CreateIndex(string collection, string index, bool asc = true)
  937. {
  938. IMongoIndexManager<BsonDocument> mgr = Database.GetCollection<BsonDocument>(collection).Indexes;
  939. var list = mgr.List();
  940. while (list.MoveNext())
  941. {
  942. if (!list.Current.Any(doc => doc["name"].AsString.StartsWith(index)))
  943. {
  944. return mgr.CreateOne(asc ? Builders<BsonDocument>.IndexKeys.Ascending(doc => doc[index]) : Builders<BsonDocument>.IndexKeys.Descending(doc => doc[index]));
  945. }
  946. }
  947. return string.Empty;
  948. }
  949. /// <summary>
  950. /// 创建索引
  951. /// </summary>
  952. /// <param name="collection">集合名</param>
  953. /// <param name="index">索引键</param>
  954. /// <param name="asc"></param>
  955. /// <returns></returns>
  956. public async Task<string> CreateIndexAsync(string collection, string index, bool asc = true)
  957. {
  958. IMongoIndexManager<BsonDocument> mgr = Database.GetCollection<BsonDocument>(collection).Indexes;
  959. var list = mgr.List();
  960. while (list.MoveNext())
  961. {
  962. if (!list.Current.Any(doc => doc["name"].AsString.StartsWith(index)))
  963. {
  964. return await mgr.CreateOneAsync(asc ? Builders<BsonDocument>.IndexKeys.Ascending(doc => doc[index]) : Builders<BsonDocument>.IndexKeys.Descending(doc => doc[index]));
  965. }
  966. }
  967. return string.Empty;
  968. }
  969. /// <summary>
  970. /// 更新索引
  971. /// </summary>
  972. /// <param name="collection">集合名</param>
  973. /// <param name="index">索引键</param>
  974. /// <param name="asc"></param>
  975. /// <returns></returns>
  976. public string UpdateIndex(string collection, string index, bool asc = true)
  977. {
  978. IMongoIndexManager<BsonDocument> mgr = Database.GetCollection<BsonDocument>(collection).Indexes;
  979. return mgr.CreateOne(asc ? Builders<BsonDocument>.IndexKeys.Ascending(doc => doc[index]) : Builders<BsonDocument>.IndexKeys.Descending(doc => doc[index]));
  980. }
  981. /// <summary>
  982. /// 更新索引
  983. /// </summary>
  984. /// <param name="collection">集合名</param>
  985. /// <param name="index">索引键</param>
  986. /// <param name="asc"></param>
  987. /// <returns></returns>
  988. public async Task<string> UpdateIndexAsync(string collection, string index, bool asc = true)
  989. {
  990. IMongoIndexManager<BsonDocument> mgr = Database.GetCollection<BsonDocument>(collection).Indexes;
  991. return await mgr.CreateOneAsync(asc ? Builders<BsonDocument>.IndexKeys.Ascending(doc => doc[index]) : Builders<BsonDocument>.IndexKeys.Descending(doc => doc[index]));
  992. }
  993. /// <summary>
  994. /// 删除索引
  995. /// </summary>
  996. /// <param name="collection">集合名</param>
  997. /// <param name="index">索引键</param>
  998. /// <returns></returns>
  999. public void DropIndex(string collection, string index)
  1000. {
  1001. Database.GetCollection<BsonDocument>(collection).Indexes.DropOne(index);
  1002. }
  1003. /// <summary>
  1004. /// 删除索引
  1005. /// </summary>
  1006. /// <param name="collection">集合名</param>
  1007. /// <param name="index">索引键</param>
  1008. /// <returns></returns>
  1009. public void DropIndexAsync(string collection, string index)
  1010. {
  1011. Database.GetCollection<BsonDocument>(collection).Indexes.DropOneAsync(index);
  1012. }
  1013. /// <summary>
  1014. /// 创建索引
  1015. /// </summary>
  1016. /// <param name="collection">集合名</param>
  1017. /// <param name="index">索引键</param>
  1018. /// <param name="key"></param>
  1019. /// <param name="asc"></param>
  1020. /// <returns></returns>
  1021. public string CreateIndex<T>(string collection, string index, Expression<Func<T, object>> key, bool asc = true)
  1022. {
  1023. IMongoIndexManager<T> mgr = Database.GetCollection<T>(collection).Indexes;
  1024. var list = mgr.List();
  1025. while (list.MoveNext())
  1026. {
  1027. if (!list.Current.Any(doc => doc["name"].AsString.StartsWith(index)))
  1028. {
  1029. return mgr.CreateOne(asc ? Builders<T>.IndexKeys.Ascending(key) : Builders<T>.IndexKeys.Descending(key));
  1030. }
  1031. }
  1032. return String.Empty;
  1033. }
  1034. /// <summary>
  1035. /// 创建索引
  1036. /// </summary>
  1037. /// <param name="collection">集合名</param>
  1038. /// <param name="index">索引键</param>
  1039. /// <param name="key"></param>
  1040. /// <param name="asc"></param>
  1041. /// <returns></returns>
  1042. public async Task<string> CreateIndexAsync<T>(string collection, string index, Expression<Func<T, object>> key, bool asc = true)
  1043. {
  1044. IMongoIndexManager<T> mgr = Database.GetCollection<T>(collection).Indexes;
  1045. var list = mgr.List();
  1046. while (list.MoveNext())
  1047. {
  1048. if (!list.Current.Any(doc => doc["name"].AsString.StartsWith(index)))
  1049. {
  1050. return await mgr.CreateOneAsync(asc ? Builders<T>.IndexKeys.Ascending(key) : Builders<T>.IndexKeys.Descending(key));
  1051. }
  1052. }
  1053. return String.Empty;
  1054. }
  1055. /// <summary>
  1056. /// 更新索引
  1057. /// </summary>
  1058. /// <param name="collection">集合名</param>
  1059. /// <param name="key"></param>
  1060. /// <param name="asc"></param>
  1061. /// <returns></returns>
  1062. public string UpdateIndex<T>(string collection, Expression<Func<T, object>> key, bool asc = true)
  1063. {
  1064. IMongoIndexManager<T> mgr = Database.GetCollection<T>(collection).Indexes;
  1065. return mgr.CreateOne(asc ? Builders<T>.IndexKeys.Ascending(key) : Builders<T>.IndexKeys.Descending(key));
  1066. }
  1067. /// <summary>
  1068. /// 更新索引
  1069. /// </summary>
  1070. /// <param name="collection">集合名</param>
  1071. /// <param name="key"></param>
  1072. /// <param name="asc"></param>
  1073. /// <returns></returns>
  1074. public async Task<string> UpdateIndexAsync<T>(string collection, Expression<Func<T, object>> key, bool asc = true)
  1075. {
  1076. IMongoIndexManager<T> mgr = Database.GetCollection<T>(collection).Indexes;
  1077. return await mgr.CreateOneAsync(asc ? Builders<T>.IndexKeys.Ascending(key) : Builders<T>.IndexKeys.Descending(key));
  1078. }
  1079. #endregion
  1080. }
  1081. }