经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 数据库/运维 » MongoDB » 查看文章
表单生成器(Form Builder)之mongodb表单数据查询——返回分页数据和总条数 - du-blog
来源:cnblogs  作者:du-blog  时间:2019/11/11 8:44:50  对本文有异议

  上一篇笔记将开始定义的存储结构处理了一下,将FormItems数组中的表单项都拿到mongodb document的最外层,和以前的关系型数据类似,之不过好多列都是动态的,不固定,不过这并没有什么影响。结果就是方便我们更好的查询和统计;还有一点就是转换之后从服务器端返回客户端的对象也是如此,这样更加方便了获取每个表单项的值(例如渲染列表)。

  我们的好的应用场景都是分页加载,好多地方都需要知道总的条数。以前呢是弄了两个API:一个是获取查询结果;一个是获取条数。为了这样一个功能要多发送一个API觉得有点浪费,之后便上网查了一下,这个问题前辈门已经遇到过了并且解决了,这里只是记录一下。我找到了几种处理方式,下面一一介绍一下。

  第一种

  1. // $facet New in version 3.4.
  2. db.getCollection('FormInstace').aggregate([
  3. {
  4. $facet: {
  5. totalCount: [{ $match:{FormId:'507048044944691000'} },{ $count: 'totalCount' }],
  6. results: [{ $match:{FormId:'507048044944691000'} }]
  7. }
  8. }
  9. ]);

  方案二

  1. // 方案2:
  2. async function getQuery() {
  3. let query = await db.collection.find({}).skip(5).limit(5); // returns last 5 items in db
  4. let countTotal = await query.count() // returns 10-- will not take `skip` or `limit` into consideration
  5. let countWithConstraints = await query.count(true) // returns 5 -- will take into consideration `skip` and `limit`
  6. return { query, countTotal }
  7. }

  等待截图……

  以上两个方案都来自于:https://stackoverflow.com/questions/21803290/get-a-count-of-total-documents-with-mongodb-when-using-limit

  方案三

  1. // 方案3:
  2. db.getCollection('FormInstace').aggregate([
  3. {
  4. $match: {
  5. "FormItems.key": { $ne: null }
  6. }
  7. },
  8. {
  9. $addFields: {
  10. FormValueObj: {
  11. $arrayToObject: {
  12. $map: {
  13. input: "$FormItems",
  14. as: "field",
  15. in: [ "$$field.key", "$$field.value" ]
  16. }
  17. }
  18. }
  19. }
  20. },
  21. {
  22. $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }
  23. },
  24. {
  25. $project: {
  26. FormItems:0,
  27. FormValueObj:0
  28. }
  29. },
  30. {
  31. $match:{FormId:'507048044944691000'}
  32. },
  33. {
  34. $group: {
  35. _id: null,
  36. count: { $sum: 1 },
  37. results: { $push: '$$ROOT' }
  38. }
  39. },
  40. {
  41. $project:{_id:0,count:1, results: { $slice: [ "$results", 20, 20 ] }}
  42. }
  43. ]);

  方案三参考的是:https://medium.com/@kheengz/mongodb-aggregation-paginated-results-and-a-total-count-using-d2e23a00f5d5 但是上面的连接中也包括了这种方式……不管怎么说达到了我们想要的结果,并且支持分页!!!就是时间还是有点长,以后看看还能不能优化,如果有哪位大神有更好的方式,请告知,在这里表示感谢……

原文链接:http://www.cnblogs.com/du-blog/p/11832115.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号