表單生成器(Form Builder)之mongodb表單數據查詢——返回分頁數據和總條數

  上一篇筆記將開始定義的存儲結構處理了一下,將FormItems數組中的表單項都拿到mongodb document的最外層,和之前的關係型數據相似,之不過好多列都是動態的,不固定,不過這並無什麼影響。結果就是方便咱們更好的查詢和統計;還有一點就是轉換以後從服務器端返回客戶端的對象也是如此,這樣更加方便了獲取每一個表單項的值(例如渲染列表)。mongodb

  咱們的好的應用場景都是分頁加載,好多地方都須要知道總的條數。之前呢是弄了兩個API:一個是獲取查詢結果;一個是獲取條數。爲了這樣一個功能要多發送一個API以爲有點浪費,以後便上網查了一下,這個問題前輩門已經遇到過了而且解決了,這裏只是記錄一下。我找到了幾種處理方式,下面一一介紹一下。數組

  第一種服務器

//        $facet    New in version 3.4.
db.getCollection('FormInstace').aggregate([
  {
    $facet: {
        totalCount: [{ $match:{FormId:'507048044944691000'} },{ $count: 'totalCount' }],
      results: [{ $match:{FormId:'507048044944691000'} }]
    }
  }
]);

  方案二async

//    方案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 } 
}

  等待截圖……
ide

  以上兩個方案都來自於:https://stackoverflow.com/questions/21803290/get-a-count-of-total-documents-with-mongodb-when-using-limit優化

  方案三spa

//    方案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:'507048044944691000'}
    },
    { 
        $group: {
            _id: null,
            count: { $sum: 1 },
            results: { $push: '$$ROOT' }
        }     
    },
    {
        $project:{_id:0,count:1, results: { $slice: [ "$results", 20, 20 ] }}
    }
]);

  方案三參考的是:https://medium.com/@kheengz/mongodb-aggregation-paginated-results-and-a-total-count-using-d2e23a00f5d5 可是上面的鏈接中也包括了這種方式……無論怎麼說達到了咱們想要的結果,而且支持分頁!!!就是時間仍是有點長,之後看看還能不能優化,若是有哪位大神有更好的方式,請告知,在這裏表示感謝……code

相關文章
相關標籤/搜索