MongoDbClient.cs 46 KB

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