使用MongoDB,使用C#驱动程序,我需要为属性x
构建更新
x.y
设置为42 x
为空x
设置为具有其他属性的对象(在这种情况下我需要保留这些属性),这也有效。换句话说,我需要为属性x
构建一个更新,将x.y
设置为42并同时对以下两个输入文档起作用:
{
"x": null
}
should become
{
"x": {
"y": 42
}
}
和
{
"x": {
"z": 66
}
}
should become
{
"x": {
"y": 42,
"z": 66
}
}
天真的做法
Builders<BsonDocument>.Update.Set("x.y", 42)
导致错误消息
cannot use the part (x of x.y) to traverse the element ({x: null})
答案 0 :(得分:1)
这里理想的解决方案是清理数据,使字段不为空。您可以在模型中的属性上使用[BsonIgnoreIfNull]来帮助在第一时间停止设置null。
但要实现此目的,您需要执行2次操作
第一个检查x为空,如果不是,则对“x”(AddToSet)执行更新,如果是,则执行更新以设置整个“x”(设置)
这未经过测试,但例如:
var fb = Builders<YourObject>.Filter;
var idFilter = fb.Eq(f => f.Id, "");//Your filter otherwise you will be updating all documents
var nullFilter = fb.Eq(f => f.x, BsonNull.Value);//Filter to check x is set to null
var result = await Collection.Find(fb.And(idFilter, nullFilter))
.CountAsync()
.ConfigureAwait(false);
var toAppend = new BsonDocument("y", 42);
if (result > 0)
{
var update = Builders<YourObject>.Update.AddToSet(f => f.x, toAppend);
await Collection.UpdateOneAsync(f => idFilter, update).ConfigureAwait(false);
}
else
{
var update = Builders<YourObject>.Update.Set(f => f.x, toAppend);
await Collection.UpdateOneAsync(x => idFilter, update).ConfigureAwait(false);
}
这是另一个提出相同问题的问题:
Update with AddToSet not updating null value with MongoDB C#
我希望这会有所帮助