MongoDB中的默认ObjectId

时间:2016-11-30 09:53:37

标签: c# .net mongodb database

我使用MongoDB在WPF应用程序中存储数据。我很少有'模特'类,继承自相同的基类,如下所示:

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(只是零)存储。因此,当我插入一些第二个新文档时,它只是替换了第一个新文档,因此在此集合中不可能有多个文档。

你有什么想法,为什么它适用于一个案例而不是其他案例?有什么建议吗?

1 个答案:

答案 0 :(得分:1)

好的,对不起主题,我可能在两天后发现了问题。 因为第一类中的Code必须是唯一的,所以我称之为构造:

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

在这种情况下,我正在使用“非ID”搜索数据库。节点和代码无法找到时,Mongo创建新文档并用生成的文档替换DefaultId。

但是在Class1的第二种情况下,我没有任何独特的领域,所以我称之为:

await _coll.ReplaceOneAsync(c => c.Id.Equals(code.Id), code, 
                     new UpdateOptions {IsUpsert = true});

所以我'触摸' Id字段,在这种情况下,Mongo可能认为,这是我想要使用的Id,因此当某个文档带有DefaultId时,它与DefaultId一起存储,而不是用生成的一个替换。当第二个文档带有Id时,它就被替换了。在这种情况下,有必要在保存文档之前手动生成Id:

if(entity.Id == ObjectId.Empty)
   entity.Id = ObjectId.GenerateNewId();

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