工作需要,用到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小时差别。
下一篇文章,会讲解聚合管道的比较复杂的用法,如数据分组统计 等。