防止嵌套对象的 mongodb C# 驱动程序将 id 序列化为 _id

2024-02-29

我正在使用 C# mongodb 驱动程序来更新 mongodb 中的记录。下面的代码对我来说工作正常,但它会自动将所有出现的“id”转换为“_id”。

var client = GetMongoClient();
var collection1 = GetMongoCollection("collection1");
var collection2 = GetMongoCollection("collection2");

using (var session = await client.StartSessionAsync())
{
     session.StartTransaction();

    try
    {
        var filter = Builders<BsonDocument>.Filter.Eq("_id", projectInfo._Id);

        BsonDocument projectInfoBD = projectInfo.ToBsonDocument();
        var recordAfterUpdate = await collection1.ReplaceOneAsync(session, filter, projectInfoBD);
        
        ......
    }
    catch (Exception ex)
    {
        await session.AbortTransactionAsync();
        return false;
    }
}

我的 C# 课程

public class ProjectInfo
{
    public string _Id { get; set; } //This is primary key which unique for project info
    public ProjectBasicDetail BasicDetails { get; set; }
}

public class ProjectBasicDetail
{
    public string Name { get; set; }
    public string Description { get; set; }
    public Option Status { get; set; }
    public TextOption CreatedBy { get; set; }
}

public class TextOption
{
    public string Id { get; set; } //don't want to convert to "_id"
    public string Name { get; set; }
}

public class Option
{
    public int Id { get; set; } //don't want to convert to "_id"
    public string Name { get; set; }
}

更新记录后,我希望更新后的记录看起来像这样

{
  "_id": "kjsldfkjlsdkfjsd",
  "basicDetails": {
    "name": "test name",
    "description": "test desc",
    "status": {
      "id": 11,
      "name": "processing"
    },
    "createdBy": {
      "id": "123",
      "name": "some user"
    }
  }
}

但它保存如下。它将所有出现的“id”转换为我不想要的“_id”

{
  "_id": "kjsldfkjlsdkfjsd", //This is ok
  "basicDetails": {
    "name": "test name",
    "description": "test desc",
    "status": {
      "_id": 11, //This should be "id"
      "name": "processing"
    },
    "createdBy": {
      "_id": "123",  //This should be "id"
      "name": "some user"
    }
  }
}

提前致谢...


属性名称与Id已锁定重命名为_id在蒙戈这边。

你有两个选择。在 C# 方面将其称为其他名称,例如IdStr>

public class TextOption
{
    [BsonElement("id")]
    public string IdStr { get; set; } //don't want to convert to "_id"
    public string Name { get; set; }
}

public class Option
{
    [BsonElement("id")]
    public int IdStr { get; set; } //don't want to convert to "_id"
    public string Name { get; set; }
}

或者使用基本映射进行调整>

var client = new MongoClient();
var database = client.GetDatabase("test");
var collection = database.GetCollection<ProjectInfo>("projects");
BsonClassMap.RegisterClassMap<TextOption>(cm =>
{
    cm.AutoMap();
    cm.UnmapProperty(c => c.Id);
    cm.MapMember(c => c.Id)
        .SetElementName("id")
        .SetOrder(0) //specific to your needs
        .SetIsRequired(true); // again specific to your needs
});
BsonClassMap.RegisterClassMap<Option>(cm =>
{
    cm.AutoMap();
    cm.UnmapProperty(c => c.Id);
    cm.MapMember(c => c.Id)
        .SetElementName("id")
        .SetOrder(0) //specific to your needs
        .SetIsRequired(true); // again specific to your needs
});
using (var session = await client.StartSessionAsync())
{
    await collection.InsertOneAsync(session,
        new ProjectInfo
        {
            _Id = "604b5fa389ff6887d1b91a91",
            BasicDetails = new ProjectBasicDetail
            {
                CreatedBy = new TextOption { Id = "604b5fa389ff6887d1b91a93", Name = "a" },
                Description = "b",
                Name = "c",
                Status = new Option { Id = 123, Name = "status name" }
            }
        });
}

还添加[BsonId]给你的ProjectInfo类,所以它不重复,并且有string代表>

public class ProjectInfo
{
    [BsonId]
    public string _Id { get; set; } //This is primary key which unique for project info
    public ProjectBasicDetail BasicDetails { get; set; }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

防止嵌套对象的 mongodb C# 驱动程序将 id 序列化为 _id 的相关文章

  • 如何用另一个静态变量初始化一个静态变量?

    静态1 hpp include
  • C++:字符串流有什么好处?

    谁能告诉我一些在 C 中使用字符串流的实际例子 即使用流插入和流提取运算符输入和输出到字符串流 您可以使用字符串流来转换任何实现operator lt lt 到一个字符串 include
  • 值类型如何实现引用类型

    我遇到了一个值类型正在实现 ref 的场景 类型 只是想知道这怎么可能 幕后发生了什么 结构体是值类型 接口是引用 类型但结构可以实现接口而不会出现任何错误 有什么想法吗 提前致谢 实际上 它同时以两种不同的方式进行 首先 任何值类型都可以
  • MongoDB 嵌套数组查询

    我问这个作为评论another https stackoverflow com questions 5250652 query a nested array in mongodb问题 还发了一个question https groups g
  • 析构函数与成员函数竞赛

    当我在析构函数内时 其他线程是否可能开始执行对象的成员函数 遇到这种情况该如何处理呢 C 没有内在的保护来防止在删除对象后使用它 忘记竞争条件 另一个线程可以在完全删除你的对象后使用你的对象 Either 确保只有一个位置 代码拥有该对象
  • 为什么 ObservableCollection 有两个集合构造函数?

    The 可观察集合 T https msdn microsoft com en us library ms668604类有两个构造函数 可以在其中传递项目集合 一个构造函数接受一个IEnumerable T 另一个List T 鉴于List
  • UI 线程正在阻塞调用 COM 对象的后台线程

    我正在开发一个通过第三方 COM 库与外部设备通信的应用程序 我试图让与设备的所有通信都通过后台线程 以防止通信问题搞砸我的应用程序 并消除在 UI 线程中进行通信所引入的一些其他复杂性 问题是 每当发生导致主 UI 线程阻塞的情况 即调用
  • 用 OpenCL C 编写快速线性系统求解器

    我正在编写一个 OpenCL 内核 它将涉及求解线性系统 目前我的内核太慢了 提高线性系统部分的性能似乎是一个不错的起点 我还应该注意 我并没有尝试使我的线性求解器并行 我正在研究的问题在宏观层面上已经是令人尴尬的并行 以下是我编写的 C
  • 将 std::pair const 转换为 std::pair const 安全吗?

    理论上或实践上 安全吗reinterpret cast a std pair
  • FFplay成功移入我的Winform中,如何设置它无边框?

    用这个代码 在 C 应用程序中显示 tcp 视频流 来自 FFPLAY FFMPEG https stackoverflow com questions 14201894 show a tcp video stream from ffpla
  • 为什么最小的 int -2147483648 的类型为“long”? [复制]

    这个问题在这里已经有答案了 对于一个学校项目 我必须编写 C 函数 printf 的代码 一切进展顺利 但有一个问题我找不到好的答案 所以我来了 printf PRINTF d t d n 2147483648 告诉我 gcc Werror
  • “DeploymentItem”属性是什么意思?

    假设我们有一个简短的程序 namespace ConsoleTryIt static class Program static void Main string args var sum Add 1 2 private static int
  • 如何将 Boost Spirit 自动规则与 AST 结合使用?

    编辑 当我想在另一个规则上使用它时 我扩展了 sehe 的示例以显示问题 http liveworkspace org code 22lxL7 http liveworkspace org code 22lxL7 17 我正在尝试提高 Bo
  • Rx 在不同的线程上生产和消费

    我试图通过此处的示例代码来简化我的问题 我有一个生产者线程不断地输入数据 并且我尝试在批次之间添加时间延迟来对其进行批处理 以便 UI 有时间渲染它 但结果并不如预期 生产者和消费者似乎在同一个线程上 我不希望批处理缓冲区在正在生成的线程上
  • 从 AuthorizeAttribute 继承的属性不起作用

    我目前正在尝试根据用户角色在新的 ASP MVC 5 应用程序中实现安全性 目标是防止用户在没有特定角色 或更高角色 的情况下访问某些控制器或控制器方法 根据到目前为止我所读到的问题 我创建了一个继承 AuthorizeAttribute
  • 在链表程序中使用模板时重载 C++ 中的 << 运算符

    我正在尝试实现一个链接列表 但是当我尝试重载 include
  • 调用泛型类的方法

    这是上下文 我尝试编写一个映射器来动态地将域模型对象转换为 ViewModel 对象 我遇到的问题是 当我尝试通过反射调用泛型类的方法时 出现此错误 System InvalidOperationException 无法对 Contains
  • 小数精度

    我使用小数类型进行高精度计算 货币 但我今天遇到了这个简单的划分 1 1 37 这应该再次得到 37 http www wolframalpha com input i 1 2F 281 2F37 29 http www wolframal
  • 从其对象获取结构体字段的名称和类型

    例如 我有一个类似这样的结构 struct Test int i float f char ch 10 我有一个该结构的对象 例如 Test obj 现在 我想以编程方式获取字段名称和类型obj 是否可以 顺便说一句 这是 C 你正在要求C
  • 为什么 INT64_MIN 的定义不同?为什么他们的行为不同?

    The stdint h我公司的标题是 define INT64 MIN 9223372036854775808LL 但在我项目的一些代码中 一位程序员写道 undef INT64 MIN define INT64 MIN 92233720

随机推荐

  • Java 内置函数 Collections.Frequency(list, element) 的复杂度是多少?

    下面的代码是针对 String 的 ArrayList 的 我想知道这个问题的复杂度是多少Collections frequency 功能 List
  • MessageBox 中的粗体文本

    如何在显示的对话框中以粗体显示文本MessageBox Show 使用 C 有可能 消息框是一个常规窗口 可以像其他窗口一样被弄乱 然而 这样做的代码有点粗糙 将新类添加到您的项目并粘贴以下代码 using System using Sys
  • 如何在java中打开受密码保护的docx文件?

    我想使用 Apache POI 打开受密码保护的 docx 文件 谁能帮我完整的代码吗 我无法使用此代码得到解决方案 线程 main org apache poi poifs filesystem OfficeXmlFileExceptio
  • 深度克隆(复制)可变 Scala 对象的最简单方法是什么?

    深度克隆 复制 可变 Scala 对象的最简单方法是什么 由于您想要以最简单的方式深度复制 Scala 对象 而不是最快的方式 因此您始终可以序列化该对象 前提是它是可序列化的 然后将其反序列化回来 以下代码仅在编译时运行 而不是在 REP
  • 使用 OAuth 2.0 对用户进行身份验证时,重定向 URL 如何知道他们属于哪个用户?

    我是 Web 开发新手 并试图通过构建使用 Google API 的 Web 应用程序来入门 我正在阅读 Google 关于使用 OAuth 2 0 的文档 但重定向 URL 位让我有点困惑 根据例子here https developer
  • 如何防止 Kendo MultiSelect 在网格模板中编辑后丢失值?

    我有一个显示以逗号分隔的值列表的网格 并且它有一个在网格的模板编辑器中使用的数组 在服务器上 我将逗号分隔的列表转换为 Kendo 多选 AngularJS 指令的数组 我几乎已经完成了所有工作 在多选中显示 编辑和添加值 只是发生了一件奇
  • 如何在 dot net core 中获取另一个时区的本地时间

    我正在解决一个问题 我需要获取另一个时区的当前日期和时间 我不知道我的代码将在哪个时区运行 并且它需要在 Windows 和 Linux 机器上运行 我还没有找到任何方法可以做到这一点 有任何想法吗 P S 我特别需要找到瑞典的时间 包括代
  • 如何用CSS显示和隐藏div?

    在我的脚本中有三个 div 我想显示 divclass ab 当我将鼠标悬停在第一行并显示 div 时class abc 当鼠标悬停在第二行时 否则我想显示 divclass a 默认情况下 但它从不显示 divclass a abc ab
  • 如何检查是否已在 元素中选择文件?

    我有多个复选框和一个文件上传输入 如果选中一个或多个复选框并且输入值不为空 我想重新启用按钮 这是一个链接bootply http www bootply com 6YZf8l4QVa 这是我的html div class upload b
  • Django 将 URL 重定向到最新创建的博客文章

    我希望在 urls py 中进行重定向 以便当人们访问博客应用程序索引域时自动加载我的博客应用程序中的最新帖子条目 Blog Post 详细信息通过 blog views post detail request slug 方法提供 博客文章
  • 如何在 Angular 5 中获取上一页 URL

    我正在使用 Angular 5 应用程序 我需要知道如何获取最后一个 URL 将其作为后退按钮的链接 我找到了这个location back 但我需要最后一个 url 作为字符串 我怎样才能得到生成的字符串location back 非常感
  • RStudio 更改 pandoc .latex 模板

    我想使用不同的 Latex 模板来渲染 R markdown 版本 2 我发现了以下建议 a 模板位置 system file rmd latex default tex package rmarkdown b YAML Front Mat
  • Collectstatic 创建空文件

    我正在尝试将应用程序升级到 Django 1 11 但遇到了问题collectstatic 旧版本 django 1 8 17 django storages 1 5 1 新版本 django 1 11 12 django storages
  • C 中指针比较如何工作?可以比较不指向同一数组的指针吗?

    在 K R C 编程语言第二版 第 5 章中 我读到了以下内容 首先 在某些情况下可以比较指针 如果p and q指向同一个数组的成员 那么关系如下 lt gt 等工作正常 这似乎意味着只能比较指向同一数组的指针 但是当我尝试这段代码时 c
  • 解析 LocalDate 但得到 DateTimeParseException; dd-MMM-uuuu

    我正在尝试转换String to LocalDate using DateTimeFormatter 但我收到一个异常 java time format DateTimeParseException Text 2021 10 31 无法在索
  • 如何在 65536 行后添加 SSRS 分页符,计算组页眉/页脚

    我有一个 SSRS 报告 当行数大于 Excel 2003 限制 65536 时 该报告无法导出到 Excel 该报告已经具有带有组页脚的分组级别 我尝试在表达式上添加一个带有分页符的额外分组级别 ceiling rownumber not
  • 线太长。姜戈 PEP8

    PEP8信息 models py 10 80 E501 line too long 83 gt 79 characters 模型 py field TreeForeignKey self null True blank True relat
  • 展开/折叠 ttk Treeview 分支

    我想知道 ttk Treeview 中折叠和展开分支的命令 这是一个简约的示例代码 coding utf 8 import tkinter as tk from tkinter import ttk root tk Tk tree ttk
  • 沿直线或路径移动 SVG 对象

    我想要为 SVG 对象设置动画 以便它遵循我从 d3 js 中的线条生成器构建的 SVG 路径 有什么简单的方法可以实现这一目标吗 特别是 我想获得与我的路径相对应的插值坐标 从那里 使用 tween js 或 d3 js 本身执行动画将很
  • 防止嵌套对象的 mongodb C# 驱动程序将 id 序列化为 _id

    我正在使用 C mongodb 驱动程序来更新 mongodb 中的记录 下面的代码对我来说工作正常 但它会自动将所有出现的 id 转换为 id var client GetMongoClient var collection1 GetMo