在C#中使用MongoDB中的潜在null属性设置子属性

时间:2016-10-14 15:59:48

标签: c# mongodb

使用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})

1 个答案:

答案 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#

我希望这会有所帮助

相关问题