上一篇筆記將開始定義的存盤結構處理了一下,將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 但是上面的連接中也包括了這種方式……不管怎么說達到了我們想要的結果,并且支持分頁!!!就是時間還是有點長,以后看看還能不能優化,如果有哪位大神有更好的方式,請告知,在這里表示感謝……
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/2501.html
標籤:其它
