MongoDb / C# 过滤并获取所有子文档

2023-12-07

我在查询 Mongodb 集合时遇到困难。

我正在使用的文档

public class Customer
{
    public ObjectId Id { get; set; }

    public int CustomerId { get; set; }

    public List<Address> Addresses { get; set; }
}

public class Address
{
    public string Name { get; set; }
}

一些样本数据

{
    CustomerId: 2,
    Addresses: [
        {
            Name: "Daniel"
        },
        {
            Name: "Eric"
        },
        {
            Name: "Dan"
        }
        ]
}

我现在想按 CustomerId 查询文档并过滤一些地址值以返回名称如 %Dan% 的所有地址。由于地址集合可能很大,我想在查询时就过滤掉这些地址

var mdb = mongoClient.GetDatabase("test");
var collection = mdb.GetCollection<WebApi>("Customer");
var builder = Builders<Customer>.Filter;
var searchTerm = "Dan";

当这样查询时,它可以工作,但它包含所有地址:

var filter = builder.And(builder.Eq("InstallationId", 2),
                         builder.Regex("Addresses.Name", new BsonRegularExpression(".*" + searchTerm + ".*", "i")))
var result = collection.Find(filter).FirstOrDefault();

我想得到的是:

[
    {
        Name: "Daniel"
    },
    {
        Name: "Dan"
    }
]

or

{
    CustomerId: 2,
    Addresses: [
        {
            Name: "Daniel"
        },
        {
            Name: "Dan"
        }
        ]
}

我还尝试了几种使用聚合/匹配/项目的方法,但无法使其工作。 “AsQueryable”也不起作用,因为 IndexOf 未在驱动程序上实现。

collection.AsQueryable().Where(x => x.CustomId == 2).SelectMany(x =>
                x.Addresses.Where(a => a.Name.IndexOf(searchTerm, StringComparison.InvariantCultureIgnoreCase) >= 0).ToList();

使用的版本:

  • MongoDB.Driver v 2.6.1(也是 Bson)
  • .Net框架4.5.2

这应该会让你继续:

var result = collection
    .Aggregate()
    .Match(c => c.CustomerId == 2)
    .Project(c => new
        {
            c.CustomerId,
            Addresses = c.Addresses.Where(a => a.Name.IndexOf(searchTerm) != -1)
        })
    .ToList();

驱动程序会将其翻译为:

db.Customer.aggregate([{
    $match: { CustomerId: 2 }
}, {
    $project: {
        CustomerId: "$CustomerId",
        Addresses: {
            $filter: {
                input: "$Addresses",
                as: "a",
                cond: {
                    $ne: [ { $indexOfBytes: [ "$$a.Name", "Dan" ] }, -1 ]
                }
            }
        },
        _id: 0
    }
}])

对于不区分大小写的版本,将来的某个阶段将可以选择使用 $regex (请参阅https://jira.mongodb.org/browse/SERVER-11947)。但是,您现在可以做的是使用ToUpper():

var result = collection
    .Aggregate()
    .Match(c => c.CustomerId == 2)
    .Project(c => new
        {
            c.CustomerId,
            Addresses = c.Addresses.Where(a => a.Name.ToUpper().IndexOf(searchTerm.ToUpper()) != -1)
        })
    .ToList();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDb / C# 过滤并获取所有子文档 的相关文章

  • BASIC 中的 C 语言中的 PeekInt、PokeInt、Peek、Poke 等效项

    我想知道该命令的等效项是什么Peek and Poke 基本和其他变体 用 C 语言 类似PeekInt PokeInt 整数 涉及内存条的东西 我知道在 C 语言中有很多方法可以做到这一点 我正在尝试将基本程序移植到 C 语言 这只是使用
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • 为什么 GCC 不允许我创建“内联静态 std::stringstream”?

    我将直接前往 MCVE include
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • C++ 多行字符串原始文字[重复]

    这个问题在这里已经有答案了 我们可以像这样定义一个多行字符串 const char text1 part 1 part 2 part 3 part 4 const char text2 part 1 part 2 part 3 part 4
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • WPF 数据绑定到复合类模式?

    我是第一次尝试 WPF 并且正在努力解决如何将控件绑定到使用其他对象的组合构建的类 例如 如果我有一个由两个单独的类组成的类 Comp 为了清楚起见 请注意省略的各种元素 class One int first int second cla
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • C 编程:带有数组的函数

    我正在尝试编写一个函数 该函数查找行为 4 列为 4 的二维数组中的最大值 其中二维数组填充有用户输入 我知道我的主要错误是函数中的数组 但我不确定它是什么 如果有人能够找到我出错的地方而不是编写新代码 我将不胜感激 除非我刚去南方 我的尝
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • LINQ:使用 INNER JOIN、Group 和 SUM

    我正在尝试使用 LINQ 执行以下 SQL 最接近的是执行交叉联接和总和计算 我知道必须有更好的方法来编写它 所以我向堆栈团队寻求帮助 SELECT T1 Column1 T1 Column2 SUM T3 Column1 AS Amoun
  • C 函数 time() 如何处理秒的小数部分?

    The time 函数将返回自 1970 年以来的秒数 我想知道它如何对返回的秒数进行舍入 例如 对于100 4s 它会返回100还是101 有明确的定义吗 ISO C标准没有说太多 它只说time 回报 该实现对当前日历时间的最佳近似 结
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • C++ 中的 include 和 using 命名空间

    用于使用cout 我需要指定两者 include
  • DotNetZip:如何提取文件,但忽略zip文件中的路径?

    尝试将文件提取到给定文件夹 忽略 zip 文件中的路径 但似乎没有办法 考虑到其中实现的所有其他好东西 这似乎是一个相当基本的要求 我缺少什么 代码是 using Ionic Zip ZipFile zf Ionic Zip ZipFile
  • 在OpenGL中,我可以在坐标(5, 5)处精确地绘制一个像素吗?

    我所说的 5 5 正是指第五行第五列 我发现使用屏幕坐标来绘制东西非常困难 OpenGL 中的所有坐标都是相对的 通常范围从 1 0 到 1 0 为什么阻止程序员使用屏幕坐标 窗口坐标如此严重 最简单的方法可能是通过以下方式设置投影以匹配渲

随机推荐

  • 将单元素数组传递给 SendInput 是一个错误吗?

    给出以下代码 void foo INPUT input input type INPUT MOUSE input mi dwFlags MOUSEEVENTF LEFTDOWN SendInput 1 input sizeof input
  • Jquery - 单击文档上任意位置时隐藏

    我有一个 div 只要您在其外部单击 它就会隐藏 但我在使 div 内的某些链接正常工作 而不是隐藏 div 时遇到了一些麻烦 document click function fav hide theDiv click function e
  • 如何获取尽可能多的有关 OpenGL 上下文的信息

    世界你好 感谢您花时间阅读本文 我正在用 GTK2 3 OpenGL 编写一个程序 我运行了该程序的两个版本 a GTK 2 GtkGlext 扩展 gt 效果很好 b GTK 3 LibX11 gt 工作得很好 一切看起来都很好 除了 a
  • 为什么 Jekyll 将类别中的大写单词转换为小写字母

    graphics3d word cloud math se 这是我的类别 为什么都是小写 我怎样才能将它们变成大写 因为我计算机中的目录是大写的 enter image description here 1 还有我的头衔 WordList
  • Ejabberd sbin/ejabberdctl start(没有这样的文件或目录)

    当我安装Ejabberd时 它给出一个错误 说它没有安装成功 但后来我有了文件夹 my ejabberd 及其中的所有文件夹 我不确定这是否已 100 安装 但是当我尝试使用命令行 sbin ejabberdctl start 启动服务器时
  • TCP 和 UDP 协议意义上的记录或数据边界是什么意思?

    我正在学习套接字并在中找到了 数据或记录边界 一词SOCK SEQPACKET通讯协议 任何人都可以用简单的话解释什么是数据边界以及如何SOCK SEQPACKET不同于SOCK STREAM SOCK DGRAM 这个答案https st
  • 有没有办法在运行时查看 Entity Framework Code First 的列映射?

    我正在尝试编写 Entity Framework Code First 的附加组件 并且需要一种在运行时获取模型列的配置的方法 例如 这是代码设置OnModelCreating by the DbModelBuilder builder E
  • 将记录集传递给函数而不是单个变量有什么缺点吗?

    我们有一个单用户 Access 2007 数据库 它可以执行诸如发送报告和根据计时器 事件 更新其他数据库之类的操作 一次一个事件 执行每个事件时 都会创建一个单行记录集 其中包含该事件运行所需的信息 我一直使用单个变量以通常的方式将参数传
  • Jupyter Notebook 500:内部服务器错误

    我想学习如何使用 Jupyter Notebook 到目前为止 我已经成功下载并安装了它 使用 pip 但我在打开它时遇到了问题 我通过输入以下内容打开它 jupyter notebook 在我的终端中 它在我的浏览器中打开 网址为 htt
  • WorkManager:如何在同一个应用程序中设置不同的WorkManager配置

    我正在开发一个多模块项目 Gradle 模块 我在我的模块中使用 WorkManager 我还使用 Dagger 进行依赖注入 现在我必须使用 dagger 将依赖项注入到我的 WorkManager 中 我非常熟悉 Dagger 2 与
  • 确定 Android GC 何时运行

    有谁知道是否有一种方法可以识别 在代码中 而不是 LogCat GC 何时运行 也许有意图被激发 我可以分析 LogCat 输出 但如果我能够确定 GC 何时从我的代码运行 那就更理想了 您可以使用弱引用技巧来做到这一点 WeakRefer
  • 连接间隔 核心蓝牙

    有没有办法通过Core Bluetooth更改连接间隔 我正在将数据块传输到外设 并且传输数据需要花费很多时间 我想减少这个时间 如果可以使用核心蓝牙从 iOS 写入或更新连接间隔 请告诉我 谢谢 仅通过将连接参数更新从外设发送到 iOS
  • 在 R 中合并具有缺失值的数据框

    获取数据帧的代码 rat all structure list frequency c 37L 31L 14L 11L 2L 3L isoforms 8 13 type structure c rat all rat all rat all
  • 在 R 的 data.table 中查找 foverlap 的一次迭代中的所有重叠

    我正在尝试使用 data table 合并 R 中的一堆重叠时间段 我有一个对表本身的 foverlap 的调用 这足够有效 我的问题是这样的 假设A期与B期重叠 B与C期重叠 但A不与C重叠 在这种情况下 A不与C分组 它们最终必须合并
  • Groupby 和 Pivot Pandas 表

    这应该很快 但是我正在做的枢轴 分组工作都没有达到我的需要 我有一个这样的表 Letter Period Amount YrMnth 2014 12 B 6 0 2014 12 C 8 1 2014 12 C 9 2 2014 12 C 1
  • 不显示背景图像的元素

    我正在尝试为 a 元素添加背景图像 但它只会显示图像的一部分 因此 如果我将 Home 作为值 则无论 home 占用的空间是什么 这就是图像的显示内容 如果该值是空它不会显示图像的任何内容 尽管我已经设置了要显示的 a 元素的宽度和高度
  • 解释 HTTP/1.1 标头字段值时使用什么编码

    在 HTTP 1 1 规范中 当涉及到定义标头时 我得到了这个 消息头 字段名称 字段值 字段值 字段内容 LWS field contet OCTET 和 TEXT 的定义是 OCTET TEXT 其中 CTL 指的是 US ASCII
  • 如何在delphi 7中释放字符串列表中的对象?

    下面是 Zarko Gajic 在 Delphi 的 TStrings 项目中释放对象的想法 在关于德尔福我使用的是 Delphi 7 TStringList 没有 OwnsObjects 运行以下代码会提示EaccessViolation
  • 向 .gitignore 添加新条目不起作用

    如果我理解正确的话 为了 忽略 一个文件 这样当我输入时它就不会出现git status or git add A我需要将其添加到 gitignore 文件中 我的目标是在向 Git 提交更改时永久忽略某个文件夹和文件 我尝试在编辑器中编辑
  • MongoDb / C# 过滤并获取所有子文档

    我在查询 Mongodb 集合时遇到困难 我正在使用的文档 public class Customer public ObjectId Id get set public int CustomerId get set public List