【问题标题】:How to update <byte, string> dictionary in MongoDB Document如何在 MongoDB 文档中更新 <byte, string> 字典
【发布时间】:2025-12-12 04:00:02
【问题描述】:

如何更新 BSON 文档中 字典属性的表示形式?我不知道如何使用 BSON 类型来做到这一点。该对象是使用自动 BSON 序列化存储的,我想替换整个字典。

假设我们有这个类:

public class Message  
{
    public string Text {get;set;}
    public Dictionary<byte, string> Contents {get;set;}
}  

在 MongoDB 中,消息集合看起来像这样:

{
  _id :  12345,
  Text : "This is a text",
  Contents: [ [1 : "true"], [3 : "youtube"] ]
}   

更新应该是这样的

var query = Query.EQ("_id", messageId);
var update = Update.Set("Contents", -> how to build me?);
MessageCollection.Update(query, update);

【问题讨论】:

  • 尝试在mongoDB manual 搜索有关 BSON 文档的信息。
  • 我没有时间告诉你,可以在这里找到答案:docs.mongodb.org/manual/core/document
  • 我有点困惑:这里的问题是什么?此代码(以及您下面其他评论中的代码)是否运行?运行时会发生什么?
  • 问题是:如何序列化 字典,然后只更新 MongoDB 中现有文档的字典方?如果您对像我这样的客户端驱动程序不熟悉,应该是一个简单的?或者只是回答“如何建造我?”从上面用一段代码。我下面答案中的代码有效,但开销很大,因为我每次都序列化完整的消息对象只是为了更新“内容”字典。

标签: c# mongodb mongodb-.net-driver


【解决方案1】:

我现在正在序列化完整的消息对象,然后取出字典部分进行更新。

var messageDoc = new BsonDocument();
var bsonWriter = BsonWriter.Create(messageDoc);
BsonSerializer.Serialize<Message>(bsonWriter, message);

var query = Query.EQ("_id", messageId);
var update = Update.Set("Contents", messageDoc["Contents"]);
MessageCollection.Update(query, update);

【讨论】:

  • 有点晚了,但SetWrapped 我相信会采用非mongo对象并自动执行所有映射。可能已经能够在这里做你想做的事,但我认为一年半后它可能已经被遗忘了......不过把这个留在这里,让下一个人遇到这个问题。