上一篇笔记将开始定义的存储结构处理了一下,将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().limit(); // 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", "");
filter &= Builders<BsonDocument>.Filter.ElemMatch("FormItems", Builders<BsonDocument>.Filter.Eq("key", "") & Builders<BsonDocument>.Filter.Eq("value.id",""));
var _query = _collection.Find(filter);
var totlaCount = _query.CountDocuments();
var results = _query.Skip().Limit().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 但是上面的连接中也包括了这种方式……不管怎么说达到了我们想要的结果,并且支持分页!!!就是时间还是有点长,以后看看还能不能优化,如果有哪位大神有更好的方式,请告知,在这里表示感谢……

最新文章

  1. linux显示git commit id,同时解决insmod模块时版本不一致导致无法加载问题
  2. DirectDraw创建Windows窗口
  3. Productivity Power Tools 动画演示(转)
  4. mac pycharm配置 python
  5. C#序列化与反序列化(Serialize,Deserialize)实例详解
  6. 用Ajax调用web api,解决URL太长的问题;
  7. DOM&amp;BOM笔记
  8. hahah
  9. UI和UE有什么区别呢?
  10. 下载caffe慢
  11. html5/h5课件如何制作?
  12. python_hashlib模块
  13. [转]RPA流程自动化-Blueprism认证考试介绍
  14. 设置 img 在 div 中水平居中和垂直居中
  15. PPT设计宝典!十招教你做出拿手的PPT
  16. MFC文件处理
  17. elasticsearch 小试牛刀
  18. 初学HTML一些基本控件语句
  19. Jetty 的工作原理
  20. Code Signal_练习题_palindromeRearranging

热门文章

  1. 【转载】Dockerfile文件详解
  2. ZOJ2770-Burn The Linked Camp(火烧连营Orz 差分约束-线性约束+最长路(OR反向最短路))
  3. ef not in
  4. jquery (内置遍历数组的函数,事件)
  5. telnet远程登陆
  6. 【Vuejs】350- 学习 Vue 源码的必要知识储备
  7. java_计算个人所得税
  8. 【CentOS7】开发环境配置
  9. final关键字、finally代码块和finalize()方法有什么区别?
  10. SQLHelper.cs类 微软C#版