[英]MongoDB .NET Driver - Aggregate group and count
我正在 C# 中开发一个与 MongoDB 通信的应用程序。 我想展示一些关于仓库中箱子数量的统计数据。 这是盒子系列:
{
"content":"0",
"warehouseId":"w0"
},
{
"content":"0",
"warehouseId":"w0"
},
{
"content":"1",
"warehouseId":"w0"
},
{
"content":"1",
"warehouseId":"w0"
},
{
"content":"2",
"warehouseId":"w0"
},
{
"content":"0",
"warehouseId":"w1"
}
还有更多字段,但这些是我现在需要的。 “content”是 Items 集合中项目的 id,“warehouseId”来自 Warehouses 集合。
我想显示每个仓库中每种物品有多少箱。 它应该类似于:
Warehouse: w0
0: 2
1: 2
2: 1
Warehouse: w1
0: 1
1: 0
2: 0
到目前为止我尝试的是这样的:
[{
$group: {
_id: {
warehouseId: '$warehouseId',
content: '$content'
},
boxes: {
$count: {}
}
}
}, {
$addFields: {
warehouseId: '$_id.warehouseId',
content: '$_id.content'
}
}, {
$project: {
_id: 0
}
}]
但这只会给我一个 output ,我对每个项目都有一个单独的文档,我被困在这里。 如何获得所需的 output 以及如何在 C# 中解决此问题? 我正在使用 MongoDB .NET 驱动程序。
$group
- 按warehouseId
和content
字段分组。 执行计数。
$group
- 按warehouseId
分组。 将具有k
和v
属性的文档推送到boxes
数组中。
$replaceRoot
- 替换输入文件。
3.1。 $mergeObjects
- 将文档与Warehouse
字段和3.1.1的结果合并。
3.1.1。 $arrayToObject
- 将box
数组转换为键值对。
$sort
(可选)- 按Warehouse
订购。
MongoDB查询
db.box.aggregate([
{
$group: {
_id: {
warehouseId: "$warehouseId",
content: "$content"
},
count: {
$sum: 1
}
}
},
{
$group: {
_id: "$_id.warehouseId",
boxes: {
$push: {
k: "$_id.content",
v: "$count"
}
}
}
},
{
$replaceRoot: {
newRoot: {
$mergeObjects: [
{
Warehouse: "$_id"
},
{
$arrayToObject: "$boxes"
}
]
}
}
},
{
$sort: {
Warehouse: 1
}
}
])
MongoDB .NET 驱动程序语法
PipelineStageDefinition<Box, BsonDocument> firstStage
= PipelineStageDefinitionBuilder.Group<Box, BsonDocument>(new BsonDocument
{
{ "_id", new BsonDocument
{
{ "warehouseId", "$warehouseId" },
{ "content", "$content" }
}
},
{ "count", new BsonDocument
{
{ "$sum", 1 }
}
}
});
PipelineStageDefinition<BsonDocument, BsonDocument> secondStage
= PipelineStageDefinitionBuilder.Group<BsonDocument, BsonDocument>(new BsonDocument
{
{ "_id", "$_id.warehouseId" },
{ "boxes", new BsonDocument
{
{ "$push", new BsonDocument
{
{ "k", "$_id.content" },
{ "v", "$count" }
}
}
}
}
});
PipelineStageDefinition<BsonDocument, BsonDocument> thirdStage
= PipelineStageDefinitionBuilder.ReplaceRoot<BsonDocument, BsonDocument>(new BsonDocument
{
{ "$mergeObjects", new BsonArray
{
new BsonDocument("Warehouse", "$_id"),
new BsonDocument("$arrayToObject", "$boxes")
}
}
});
PipelineStageDefinition<BsonDocument, BsonDocument> forthStage
= PipelineStageDefinitionBuilder.Sort(Builders<BsonDocument>.Sort.Ascending("warehouseId"));
var result = _collection.Aggregate()
.AppendStage(firstStage)
.AppendStage(secondStage)
.AppendStage(thirdStage)
.AppendStage(forthStage)
.ToList();
演示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.