1

假设我有两个类,如下所示:

public class Class1 
{
    ....
    public int CityId {get;set;}
    public string CityName {get;set;}
    public ObjectId _id {get;set;}
}

public class Class2 : Class1
{
    public string OrderId {get;set;}
}


collUser.Update(
    Query.EQ("_id", model._id), 
    Update.Replace(model)); 

当我使用对象类型时Class2,更新以正常方式工作。

但是当我使用对象类型时Class1,更新会删除OrderId记录中的字段。

我假设它替换了集合中的所有记录(文档)。

有没有办法避免这种情况?或者有比使用 Update.Set 更简单的方法吗?

Update.Set("fieldName",value).Set("fieldName2",value2)

我的意思是,如果该对象(Class1 或 Class2)拥有该属性而不删除其余字段,我只想更新字段。

4

1 回答 1

0

我不确定您是如何尝试实现这一点的,但它应该已经按照您期望的方式工作了。我已经这样做了:

var collection = db.GetCollection<Class1>("stuff");
var class2 = new Class2 {CityName = "Toronto", OrderId = "12345"};
collection.Save(class2);

var retrieved = collection.FindOne();
collection.Save(retrieved);
retrieved = collection.FindOne();
Console.WriteLine("Object deserialized as type {0}", retrieved.GetClass().Name);

retrieved对象实际上是Class2并且OrderId被保留(没有数据丢失)。我认为这可能是最预期的行为。Mongo 通过包含一个类型鉴别器来实现这一点。这基本上是对其自身的提示,因此它知道将文档反序列化为哪种类型。如果将Employee对象保存到Person类型化集合中,mongo 知道包含类型鉴别器,因为Employee它是Person.

为了避免麻烦,请遵循一个简单的规则:将您的集合强类型化为一种类型。如果您有一个包含Employeesand的集合Managers,您应该只创建db.GetCollection<Person>("people"). 这样,Mongo 就可以正常工作。一旦你开始同时做这两件事db.GetCollection<Employee>("people")db.GetCollection<Manager>("people")你就会遇到严重的麻烦(以及你发现的数据丢失问题)。

如果您仍然对这个答案不满意,您可能会喜欢直接更新文档的想法。MongoDB 实际上以其快速更新文档的能力而闻名。我强烈建议您查看本节,即使您对我的第一个建议感到满意。

于 2012-08-20T04:59:22.503 回答