MongoDbClient.cs 46 KB

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