2012-03-29 112 views
5

使用MongoDB时,我无法添加en元素时,数组为null。如果我从控制台添加项目,AddToSet按预期工作。我使用10gen的官方C#驱动程序。更新与AddToSet不更新null值与MongoDB C#

var query = Query.EQ("_id", objectId);   
var itemDoc = item.ToBsonDocument(); 

//items is an array but currently null 
var update = MongoDB.Driver.Builders.Update.AddToSet("items", itemDoc); // YUNoWork? 

//somefield doesn't exist 
var workingUpdate = MongoDB.Driver.Builders.Update.AddToSet("somefield", itemDoc); //works fine 

var collection = DataBase.GetCollection<MyObject>(CollectionName); 

collection.Update(query, update); // doesn't work 
collection.Update(query, workingUpdate); // works 

这是预期的行为吗?如果是这样,是否有一种更通用的方式将项目添加到数组中?

回答

10

做了一些挖掘,according to some other comments - 就像你说的那样,如果元素不存在,它就会起作用,但是如果它为空 - 它不起作用。显然这是设计。

一个建议是将BsonIgnoreIfNull属性添加到数组中,这意味着您的AddToSet将会起作用。

+0

对列表使用BsonIgnoreIfNull可解决C#类定义和MongoDB之间的阻抗不匹配问题。谢谢! – HatAndBeard 2012-03-30 14:51:49

+1

只是为了澄清谁看到这个答案的人,你必须清理你的现有数据才能工作。换句话说,如果你已经有一个空属性的文档,你将不得不删除属性或文档。 _那么这将在下次使用AddToSet时起作用。我已经添加了该属性,但它仍然不起作用,因为数据已经保存为null。 – adam0101 2015-10-22 21:46:55