在聚合框架 C# 中使用 Facet

2023-12-27

我想对我的数据创建一个聚合,以获取 .Net 应用程序中书籍集合的特定标签的总计数。

我有以下书籍课程。

public class Book
{
    public string Id { get; set; }

    public string Name { get; set; }

    [BsonDictionaryOptions(DictionaryRepresentation.Document)]
    public Dictionary<string, string> Tags { get; set; }
}

并且当数据保存时,会以如下格式存储在MongoDB中。

{ 
    "_id" : ObjectId("574325a36fdc967af03766dc"), 
    "Name" : "My First Book", 
    "Tags" : {
        "Edition" : "First", 
        "Type" : "HardBack", 
        "Published" : "2017", 
    }
}

我一直在 MongoDB 中直接使用构面,并且可以通过使用以下查询获得所需的结果:

db.{myCollection}.aggregate(
    [
        {
            $match: {
                "Name" : "SearchValue"
            }
        },
        {
            $facet: {
                 "categorizedByTags" : [ 
                     {   
                       $project :
                       { 
                         Tags: { $objectToArray: "$Tags" }
                       }
                     },
                     { $unwind : "$Tags"},
                     { $sortByCount : "$Tags"}
                  ]

            }
        },
    ]
);

但是我无法将其转移到 Mongo 的 .NET C# 驱动程序。如何使用 .NET C# 驱动程序执行此操作?

Edit- 我最终将寻求查询数据库中书籍的其他属性,作为分面书籍列表页面的一部分,例如出版商、作者、页数等......因此使用 $facet,除非有更好的方法这样做?


我个人不会使用$facet在这里,因为你只有一条管道,这违背了目的$facet首先...

以下更简单并且可扩展性更好($facet将创建一个可能庞大的文档)。

db.collection.aggregate([
{
    $match: {
        "Name" : "My First Book"
    }
}, {
    $project: {
        "Tags": {
            $objectToArray: "$Tags"
        }
    }
}, {
    $unwind: "$Tags"
}, {
    $sortByCount: "$Tags"
}, {
    $group: { // not really needed unless you need to have all results in one single document
        "_id": null,
        "categorizedByTags": {
            $push: "$$ROOT"
        }
    }
}, {
    $project: { // not really needed, either: remove _id field
        "_id": 0
    }
}])

可以使用 C# 驱动程序编写如下:

var collection = new MongoClient().GetDatabase("test").GetCollection<Book>("test");

var pipeline = collection.Aggregate()
    .Match(b => b.Name == "My First Book")
    .Project("{Tags: { $objectToArray: \"$Tags\" }}")
    .Unwind("Tags")
    .SortByCount<BsonDocument>("$Tags");

var output = pipeline.ToList().ToJson(new JsonWriterSettings {Indent = true});

Console.WriteLine(output);

这是使用侧面的版本:

var collection = new MongoClient().GetDatabase("test").GetCollection<Book>("test");

var project = PipelineStageDefinitionBuilder.Project<Book, BsonDocument>("{Tags: { $objectToArray: \"$Tags\" }}");
var unwind = PipelineStageDefinitionBuilder.Unwind<BsonDocument, BsonDocument>("Tags");
var sortByCount = PipelineStageDefinitionBuilder.SortByCount<BsonDocument, BsonDocument>("$Tags");

var pipeline = PipelineDefinition<Book, AggregateSortByCountResult<BsonDocument>>.Create(new IPipelineStageDefinition[] { project, unwind, sortByCount });

// string based alternative version
//var pipeline = PipelineDefinition<Book, BsonDocument>.Create(
//    "{ $project :{ Tags: { $objectToArray: \"$Tags\" } } }",
//    "{ $unwind : \"$Tags\" }",
//    "{ $sortByCount : \"$Tags\" }");

var facetPipeline = AggregateFacet.Create("categorizedByTags", pipeline);

var aggregation = collection.Aggregate().Match(b => b.Name == "My First Book").Facet(facetPipeline);

var output = aggregation.Single().Facets.ToJson(new JsonWriterSettings { Indent = true });

Console.WriteLine(output);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在聚合框架 C# 中使用 Facet 的相关文章

随机推荐

  • Maven 的 versions:display-dependency-updates 的 Ivy 等价物是什么?

    我有一个 ivy xml 文件 在其中明确指定我的依赖项 Ivy 中是否内置了任何功能 可以让我发现或自动更新过时的依赖项 我不想使用latest release 因为我想要一个完全稳定且可重现的构建 但每隔一段时间我就会想要更新一些依赖项
  • 现在,Arc Welder 无法在 Windows 上启动测试应用程序

    昨天 2015 年 10 月 19 日下午 06 00 ARC Welder 应用程序开始无法启动应用程序 由于某种原因 现在 当我单击 测试 时 Windows 10 上没有任何反应 我也在 MAC Windows 7 上进行了测试 并且
  • 执行 static_assert 模板类型是另一个模板

    我如何static assert像这样 如果 Boost 不支持 C 或 C 11 中的新功能 也许 Boost 支持它 template
  • 铸造未知类型的节点

    在使用 Neo4j 时 我能够创建带有标签的节点数组 然后在这些节点之间创建关系 这些标签本质上是到我的 POCO 的映射 Dog 标签与 C 中的 Dog POCO 相关 并且这些 POCO 从仅包含 ID 属性的简单基本 POCO 实现
  • 特定 bin 内 numpy 数组的元素数量

    我有一个乐团sorted 一维 数组长度不等 say M0 M1 and M2 我想找到每个数组有多少个元素在特定数字范围内 其中数字范围由另一个已排序数组的相邻元素 say zbin 我想知道什么是最快的方式为了达成这个 在这里 我给出了
  • MediaStore.Images.Media.insertImage 之后的文件名

    我在用MediaStore Images Media insertImage ContentResolver cr String imagePath String name String description 功能将新创建的图像插入到图库
  • Intersystems caché - 以编程方式创建新类

    是否可以编写 ObjectScript 方法 该方法将在命名空间中创建新类并编译它 我的意思是以编程方式创建新类并存储它 如果是这样 我可以稍后使用 ObjectScript 编辑此类 并重新编译 吗 原因 我在字符串变量中定义了类结构 我
  • Laggy Lazy Column Android Compose

    我已经创建了一个完整的应用程序Jetpack 组合 然而 现场的表演Lazy Column非常糟糕 而且没有任何意义 Lazy Column应该是替代RecyclerView but RecyclerView目前效果好多了 我制造了一个La
  • 测量 flutter 应用程序启动时间

    我正在寻找某种方法来测量应用程序的启动时间 从单击应用程序图标的那一刻直到用户可以看到登录页面的那一刻 Run flutter run trace startup profile 跟踪输出保存为名为的 JSON 文件start up inf
  • 如何使用 monodroid 将应用程序添加到“共享”菜单

    我的解决方案基于这篇文章 http twigstechtips blogspot com 2011 10 android sharing images or files through html http twigstechtips blo
  • 字体粗细

    我正在使用购买字体 Museo Sans 作为我正在开发的应用程序中的自定义字体 我购买时给我的文件包含不同粗细的网络字体文件 MuseoSans100Regular MuseoSans300Regular 等 font face 中有没有
  • 链接到没有锚标记的网页上的任意内容

    我正在寻找一种方法来链接到网页上特定范围的单词 图像或其他任意内容 一种替代方法是在页面上引入大量锚点 但我可以接受需要 JavaScript 的解决方案 最好也是突出目标内容的一种 如果页面内容已被修改并且链接不再有效 那么最好有某种保护
  • 污染 $scope 对象会影响性能吗?

    我有一个控制器 其中 scope 对象用于存储仅在同一控制器中本地使用的方法和值 有很多这样的事情正在发生 scope foo something scope bar something else 等等 这些值均未在视图中使用 我的问题是污
  • 在 Bash 中以字符串形式执行命令

    我正在测试一个简短的 bash 脚本 我想将字符串作为命令执行 bin bash echo AVR GCC elf main elf c main c gcc avr gcc mmcu atmega128 Wall Os o elf c e
  • aspx页面中的变量范围

    这是为什么scriptPath变量是超出范围在代码的底部 它不应该在整个页面的范围内吗 在 MVC 中 如果我将其标记在页面顶部 例如 string scriptPath assets scripts gkoConfig GkoConfig
  • 如何更改 p:barChart yaxis-tick 颜色

    如何更改 barChart yaxis tick 颜色 jqplot axis jqplot yaxis jqplot yaxis tick color green 我尝试了我能找到的任何选项 也使用 Firebug 但没有任何效果 任何想
  • HTML/JavaScript UI 小部件 GUI 构建器 [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Python Pandas 如何将 groupby 操作结果分配回父数据帧中的列?

    我在 IPython 中有以下数据框 其中每一行都是一只股票 In 261 bdata Out 261
  • jQuery:按类和输入类型选择

    我想使用 jQuery 选择一组既具有特定输入类型 例如复选框 又具有特定类的元素 但是 当我尝试以下操作时 input checkbox myClass 我没有收到任何退回的物品 我怎样才能在 jQuery 中完成这个任务 您的选择器正在
  • 在聚合框架 C# 中使用 Facet

    我想对我的数据创建一个聚合 以获取 Net 应用程序中书籍集合的特定标签的总计数 我有以下书籍课程 public class Book public string Id get set public string Name get set