1. 程式人生 > >.NET 官方驅動MongoDB.Driver的聚合管道Aggregate用法(一)之 具體實現

.NET 官方驅動MongoDB.Driver的聚合管道Aggregate用法(一)之 具體實現

工作需要,用到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小時差別。

下一篇文章,會講解聚合管道的比較複雜的用法,如資料分組統計 等。