更简单的方法是什么?
// var request = ...
var result = MyDbCollection.UpdateOneAsync(
a => otherConditions && a.MyObject != null,
Builders<MyDocument>.Update
.Set(a => a.MyObject!.A, request.A)
.Set(a => a.MyObject!.B, request.B)
.Set(a => a.MyObject!.C, request.C));
if (result.ModifiedCount <= 0)
{
MyDbCollection.UpdateOneAsync(
a => otherConditions && a.MyObject == null,
Builders<MyDocument>.Update
.Set(a => a.MyObject, new MyDocument.MyObject()
{
A = request.A,
B = request.B,
C = request.C
}));
}
注意不同的
a.MyObject != null
和 a.MyObject == null
条件,理想情况下我想做这样的事情 伪代码:
MyDbCollection.UpdateOneAsync(
a => otherConditions
Builders<MyDocument>.Update
.Condition(a => a.MyObject != null)
.Then(builder => builder
.Set(a => a.MyObject!.A, request.A)
.Set(a => a.MyObject!.B, request.B)
.Set(a => a.MyObject!.C, request.C)
)
.Else(builder => builder
.Set(a => a.MyObject, new MyDocument.MyObject()
{
A = request.A,
B = request.B,
C = request.C
})
)
此时我已经浪费了几个小时尝试使用聚合管道来完成此操作,但我不断收到此错误:
System.InvalidCastException:
Unable to cast object of type 'MongoDB.Bson.BsonArray' to type 'MongoDB.Bson.BsonDocument'.
我不再有该代码,因此无法将其复制粘贴到此处。对不起!