表单生成器(Form Builder)之mongodb表单数据查询——返回分页数据和总条数

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

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

  第一种

//        $facet    New in version 3.4.db.getCollection('FormInstace').aggregate([  {    $facet: {        totalCount: [            {                 $match:{                    FormId:'507048044944692000',                    'FormItems':{$elemMatch:{'key':'1572493552001','value.id':"1"}}                }             },            { $count: 'totalCount' }        ],        results: [            {                 $match:{                    FormId:'507048044944692000',                    FormItems:{$elemMatch:{'key':'1572493552001','value.id':"1"}}                }             }        ]    }  }]);

  方案二

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

  实际测试代码,和上面的代码类似,但是在C#中没有找到 count(true) 这样的方法

var _client = new MongoClient("mongodb://127.0.0.1:27017");var _database = _client.GetDatabase("FormBuilder");var _collection = _database.GetCollection<BsonDocument>("FormInstace");var filter = Builders<BsonDocument>.Filter.Empty;filter &= Builders<BsonDocument>.Filter.Eq("FormId", "507048044944692000");filter &= Builders<BsonDocument>.Filter.ElemMatch("FormItems", Builders<BsonDocument>.Filter.Eq("key", "1572493552001") & Builders<BsonDocument>.Filter.Eq("value.id","1"));var _query = _collection.Find(filter);var totlaCount = _query.CountDocuments();var results = _query.Skip(0).Limit(10).ToList();Console.WriteLine($"共查询到{totlaCount}条记录");Console.ReadLine();

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

  方案三

//    方案3:db.getCollection('FormInstace').aggregate([    {        $match: {            "FormItems.key": { $ne: null }        }    },    {        $addFields: {            FormValueObj: {                $arrayToObject: {                    $map: {                        input: "$FormItems",                        as: "field",                        in: [ "$$field.key", "$$field.value" ]                    }                }            }        }    },    {      $replaceRoot: { newRoot: { $mergeObjects: [ "$FormValueObj", "$$ROOT" ] } }    },    {        $project: {            FormItems:0,            FormValueObj:0        }    },    {         $match:{            FormId:'507048044944692000',            "1572493552001.id":"1"        }     },    {         $group: {            _id: null,            count: { $sum: 1 },            results: { $push: '$$ROOT' }        }         },    {        $project:{_id:0,count:1, results: { $slice: [ "$results", 0, 10 ] }}    }]);

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

(0)

相关推荐

  • 记一次Mongodb数据库更新操作之更新为数组或者对象

    一直以来都是更新为一些简单的基础类型,直到有一天写了一个覆盖某一个字段(这个字段为数组)的更新操作.出问题了,数据库中出现了_t,_v--有点懵了.当然如果我们更新的时候设置类型是不会出现这个问题的, ...

  • MongoDB帮助类

    public class MongoHelper { private static readonly string _connectionString = ConfigHelper.GetAppCon ...

  • beego中路由(Router)参数和表单(Form)参数的区别和获取

    在beego中,视图层有两种叫做参数的东西,有时候很让人困惑.它们分别是路由参数和表单参数. beego的路由映射支持灵活的结构,比如对于这种/blog/:catName可以表示的是某一个分类下的bl ...

  • JavaScript表单生成器

    在本文中,您将学习用于创建和管理Forms的JavaScript对象FormGen. 介绍 本文是关于FormGen用于创建和管理表单[1]的JavaScript对象():FormGen从创建简单的消 ...

  • python测试开发django-100.Form表单类(forms.Form)

    前言 在 HTML 页面中利用 form 表单像后端提交数据,但是很多场景下我们都需要对用户的输入做校验,比如用户是否输入,输入长度以及格式问题. django 的 Form 表单类可以帮我们快速生成 ...

  • python测试开发django-102.验证时form表单error_messages

    前言 form表单验证前端输入内容是否合法时,可以定义error_messages参数,用于前端页面展示错误信息 error_messages参数 LoginForm 表单添加 常用的error_me ...

  • python测试开发django-105.form表单自带的一些校验(validators)

    前言 validators自带一些常用的验证器,也可以自己定义一个验证器.在验证某个字段的时候,可以传validators参数用来指定验证器,以下是一些常用的验证器 MaxValueValidator ...

  • python测试开发django-103.form表单自定义校验规则(validators)

    前言 from表单常见的校验方式,常用的 CharField 可以传以下三个参数 min_length   最小长度 max_length   最大长度 required     是否是必填的 对于复 ...

  • vue中怎么动态生成form表单

    form-create 是一个可以通过 JSON 生成具有动态渲染.数据收集.验证和提交功能的表单生成组件.支持3个UI框架,并且支持生成任何 Vue 组件.内置20种常用表单组件和自定义组件,再复杂 ...

  • python测试开发django -142.Bootstrap 表单(form)

    前言 HTML 表单用于收集不同类型的用户输入.boostrap中表单有几种样式 基本垂直表单 内联表单 form-inline 水平排列表单 form-horizontal 基本表单实例 单独的表单 ...

  • HTML之form表单ENCTYPE属性解析

    服务器需要将发送的多媒体数据的类型告诉浏览器,而告诉浏览器的手段就是告知多媒体的MIME类型. form表单中的enctype属性,可以告诉服务器,我们提供给它的内容的MIME类型. enctype属 ...