c# - MongoDB中的默认ObjectId

标签 c# .net mongodb database

我正在使用MongoDB在WPF应用程序中存储数据。我有几个“model”类,它们继承自同一个基类,如下所示:
基础:

public class MongoEntityBase
{
   [BsonId]
   [BsonIgnoreIfDefault]
   public ObjectId Id { get; set; }

   public DateTime DateCreated { get; set; }
}

第一个数据类:
public class Class1 : MongoEntityBase
{
   public string Description { get; set; }

   public decimal MaxAmount { get; set; }
}

第二数据类:
public class Class2 : MongoEntityBase
{
   public string Code { get; set; }

   public string Message { get; set; }
}

我将replaceasync与激活的upsert函数一起用于插入或更新数据。当我插入新的Class1实体时,它正确地用生成的objectID存储在DB中,但是当我以同样的方式插入Class2实体时,它用默认的objectID存储(只有零)。因此,当我插入第二个新文档时,它将替换第一个文档,因此此集合中不可能有多个文档。
你知道为什么一种情况下有效而另一种情况下不有效吗?有什么建议吗?

最佳答案

好的,对不起,我可能两天后就发现了问题。
因为第一类中的代码必须是唯一的,所以我将此构造称为:

await _coll.ReplaceOneAsync(m => m.Code == message.Code, message, 
                     new UpdateOptions { IsUpsert = true });

在本例中,我使用“non-id”节点搜索db,当找不到代码时,mongo将创建新文档并用生成的文档替换defaultid。
但是在第二种情况下,对于Class1,我没有任何唯一的字段,所以我称之为:
await _coll.ReplaceOneAsync(c => c.Id.Equals(code.Id), code, 
                     new UpdateOptions {IsUpsert = true});

所以我‘触摸’id字段,在本例中,mongo可能会认为,这是我想要使用的id,所以当某个文档带有defaultid时,它会用这个defaultid存储,而不是用生成的id替换。当第二个文档带有id时,它就被替换了。在这种情况下,在保存这样的文档之前,需要手动生成id:
if(entity.Id == ObjectId.Empty)
   entity.Id = ObjectId.GenerateNewId();

我的意见不太清楚,所以我希望这对某人有帮助。

关于c# - MongoDB中的默认ObjectId,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40885154/

相关文章:

c# - 如何在不等待 1 秒的情况下对进程的 cpu 使用情况进行采样

c# - 私有(private)成员实例化/初始化的最佳实践是什么?

c# - 在 C# 中,显示可缩放和平移视频的好方法是什么?

mongodb - 清理 Express 应用程序中的输入字段

javascript - 将 Ajax 与 Mongodb 结合使用

C# 构造函数使用私有(private)/公共(public)字段

c# - 如何更改或替换数据表中的所有列名

c# - 在类属性中使用泛型类型的名称

c# - 在 "Add Payment Method"屏幕上启动 Google Pay

angularjs - 使用 Angular JS 将数据插入 MongoDB