我正在尝试创建一个控制台应用程序,它将读取Mongo数据库并根据某些业务逻辑过滤掉一些数据,并在控制台屏幕上显示结果。
直到现在我能够编写以下查询并在Mongo shell上成功执行。这是查询:
{db.Collection.aggregate([
{$unwind: { path: "$Pages"}},
{$group : {
_id :{UrlPath: "$Pages.Url.Path", I_Id : "$_id", Date: { $dateToString: { format: "%Y-%m-%d",date: "$Pages.DateTime"}}, CId: "$CId",
x: {$sum:1},
y : {$sum:"$V"}
}},
{$group : {
_id : {Date: "$_id.Date",CId: "$_id.CId", PageUrl: "$_id.UrlPath"},
p: {$sum:1},
q : {$sum:"$x"},
TotalCount: {$sum:"$y"}
}},
{$sort:{p:-1}},
],{allowDiskUse: true}).pretty();
};
我面临的问题是在C#代码中复制相同的查询逻辑。直到现在我能够连接到mongo db集合并能够进行基本的CRUD操作。
但复制这种聚合逻辑真的让我大吃一惊。我尝试过使用PipelineDefinition选项,但无法从中获得正确的输出。
有人可以在这里指导我正确的方向。
提前致谢
答案 0 :(得分:0)
最后我能够使用collection.Aggregate()方法实现它。
代码如下所示:
collection.Aggregate(new AggregateOptions { AllowDiskUse = true})
.Unwind(i => i.Pages)
.Group(new BsonDocument
{
{
"_id", new BsonDocument
{
{ "Date", new BsonDocument("$dateToString", new BsonDocument {{"format", "%Y-%m-%d"}, {"date", "$Pages.DateTime"}})},
{"CId","$_id"}
}
},
{
"x", new BsonDocument
{
{"$sum", "$Value"}
}
}
}
)
.Group(new BsonDocument
{
{
"_id", new BsonDocument
{
{"Date", "$_id.Date"},
{"CId", "$_id.CId"}
}
},
{
"p", new BsonDocument
{
{"$sum", 1}
}
},
{
"q", new BsonDocument
{
{"$sum", "$x"}
}
}
}
)
.Sort(new BsonDocument("q", -1))
.ToList();