我正在使用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/