.NET 官方驅動MongoDB.Driver的聚合管道Aggregate用法(一)之 具體實現
阿新 • • 發佈:2018-12-06
工作需要,用到MongoDB,筆者也是邊學邊用,基於官方的驅動MongoDB.Driver的Aggregate具體用法,網上資料甚少,且部分實現記錄並不詳盡。也是邊學邊用,文中錯誤之處,請留言指正。
筆者在儲存和基本的時間範圍查詢時,都可以不使用聚合管道實現而使用約束器FilterDefinitionBuilder等來實現,網上.NET基本查詢的DEMO多基於此實現,資料比較多。
Aggregate實現網上比較好的一篇文章是倉儲大叔寫的,參考意義很大,只是沒有列出Helper類的詳細內容。傳送門
首先上建立Aggregate的Helper類程式碼。
using MongoDB.Bson; using MongoDB.Driver; namespace MongoDB { public class MongoDBAggregate { //連線字串 string ConnString; public MongoDBAggregate(string vConnString) { ConnString = vConnString; } public IMongoCollection<BsonDocument> GetCollection(string dbaseName, string collectionNmae) { var server = new MongoClient(ConnString); return server.GetDatabase(dbaseName).GetCollection<BsonDocument>(collectionNmae); } public IAsyncCursor<BsonDocument> GetAggregate(string dbName,string collectionName,PipelineDefinition<BsonDocument, BsonDocument> pipeline) { return GetCollection(dbName, collectionName).Aggregate(pipeline); } } }
例項化程式碼如下:
private void button2_Click(object sender, EventArgs e) { //ISODate的時間是UTC時間,所以做查詢的時候需要北京時間減去8小時,轉字串,在用ISODate處理成 $match條件 //普通查詢 const string pipelineJson1 = " {$project : {DTime : 1 ,AdvInf : 1}}"; const string pipelineJson2 = " { $match : { AdvInf : { $eq :3 } } }"; const string pipelineJson3 = " { $match : { DTime : { $gte :ISODate('2018-12-04T02:20:12') } } }"; IList<IPipelineStageDefinition> stages = new List<IPipelineStageDefinition>(); PipelineStageDefinition<BsonDocument, BsonDocument> stage1 = new JsonPipelineStageDefinition<BsonDocument, BsonDocument>(pipelineJson1); PipelineStageDefinition<BsonDocument, BsonDocument> stage2 = new JsonPipelineStageDefinition<BsonDocument, BsonDocument>(pipelineJson2); PipelineStageDefinition<BsonDocument, BsonDocument> stage3 = new JsonPipelineStageDefinition<BsonDocument, BsonDocument>(pipelineJson3); stages.Add(stage1); stages.Add(stage2); stages.Add(stage3); PipelineDefinition<BsonDocument, BsonDocument> pipeline = new PipelineStagePipelineDefinition<BsonDocument, BsonDocument>(stages); MongoHelper operatDb = new MongoHelper(); MongoDBAggregate mongo = new MongoDBAggregate("mongodb://192.168.5.99:101"); //查詢結果 var result = mongo.GetAggregate("EHQQDZ309", "201811", pipeline).ToList(); }
上面程式碼,實現了一個簡單的查詢,等同於SQL語句“SELECT DTime,AdvInf FROM 201811 WHERE AdvInf=3 AND DTime>'2018-12-03 18:20:12'”。
注:時間條件減了8個小時,UTC和北京時間的8小時差別。
下一篇文章,會講解聚合管道的比較複雜的用法,如資料分組統計 等。