gpt4 book ai didi

c#-4.0 - '意外元素 : XX' during deserialization MongoDB C#

转载 作者:IT老高 更新时间:2023-10-28 13:37:27 24 4
gpt4 key购买 nike

我正在尝试使用以下代码将对象持久化到 MongoDB 中:

public class myClass
{
public string Heading { get; set; }
public string Body { get; set; }
}

static void Main(string[] args)
{
var mongo = MongoServer.Create();
var db = mongo.GetDatabase("myDb");
var col = db.GetCollection<BsonDocument>("myCollection");
var myinstance = new myClass();
col.Insert(myinstance);

var query = Query.And(Query.EQ("_id", new ObjectId("4df06c23f0e7e51f087611f7)));
var res = col.Find(query);
foreach (var doc in res)
{
var obj = BsonSerializer.Deserialize<myClass>(doc);
}
}

但是,在尝试反序列化文档时,我得到以下异常“意外元素:_id”。

那么我需要以另一种方式反序列化吗?这样做的首选方式是什么?

TIA

索伦

最佳答案

您正在使用 ObjectId 搜索给定文档,但是当您保存 MyClass 的实例时,您没有提供 Id 属性,因此驱动程序将为您创建一个(您可以通过添加 [BsonId 使任何属性成为 id ] 属性),当您检索该文档时,您没有 Id,因此您会收到反序列化错误。

您可以像 Chris 所说的那样将 BsonIgnorExtraElements 属性添加到类中,但是您确实应该将 ObjectId 类型的 Id 属性添加到您的类中,您显然需要 Id(因为您在查询中使用它)。由于 _id 属性是为主键保留的,因此您只会检索一个文档,因此最好像这样编写查询:

col.FindOneById(new ObjectId("4df06c23f0e7e51f087611f7"));

一旦您检索到文档,您将反序列化为 MyClass 的实例这一事实有助于强类型化集合,因此您可以在创建集合实例的地方执行此操作

var col = db.GetCollection<MyClass>("myCollection");

这样当您使用 FindOneById 方法检索文档时,驱动程序将负责反序列化,以便您将所有内容放在一起(前提是您将 Id 属性添加到类中),您可以编写

var col = db.GetCollection<MyClass>("myCollection");
MyClass myClass = col.FindOneById(new ObjectId("4df06c23f0e7e51f087611f7"));

最后要注意的是,驱动程序会在保存时为您创建 _id 属性,如果您将其从 MyClass 实例中保留下来,则每次保存该文档时,您都会获得一个新的 Id 并因此获得一个新的文档,所以如果你保存它 n 次,你就会有 n 个文档,这可能不是你想要的。

关于c#-4.0 - '意外元素 : XX' during deserialization MongoDB C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6289185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com