繁体   English   中英

MongoDB .NET 驱动程序 - 聚合组和计数

[英]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 驱动程序。

  1. $group - 按warehouseIdcontent字段分组。 执行计数。

  2. $group - 按warehouseId分组。 将具有kv属性的文档推送到boxes数组中。

  3. $replaceRoot - 替换输入文件。

    3.1。 $mergeObjects - 将文档与Warehouse字段和3.1.1的结果合并。

    3.1.1。 $arrayToObject - 将box数组转换为键值对。

  4. $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
    }
  }
])

演示@Mongo Playground

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM