ConventionRegistry.Register("IgnoreIfDefault",
new ConventionPack { new IgnoreIfDefaultConvention(true) },
_ => true);
var bsonDocument = anon.ToBsonDocument();
使用 IgnoreIfDefaultConvention 可能会导致意外行为,因为它会影响所有默认值。例如,下面列出的值将不会被保存:
int = 0
decimal = 0
bool = false
如果我只想忽略空值和空数组最好的方法是什么?
我自己没有使用它,但我认为答案是这个约定:
IgnoreIfNullConvention
。您还可以为特定字段配置特定约定:
BsonClassMap.RegisterClassMap<test>(c => c.MapField(e => e.A).SetIgnoreIfNull(ignoreIfNull: true));
或使用此属性
BsonIgnoreIfNullAttribute
更新: 如果您需要更复杂的约定,您始终可以实现自定义约定:https://mongodb.github.io/mongo-csharp-driver/2.12/reference/bson/mapping/conventions/
这是我们用来忽略空集合的自定义属性:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public class BsonIgnoreIfEmpty : Attribute, IBsonMemberMapAttribute
{
public void Apply(BsonMemberMap memberMap)
{
// Get the member where the attribute is applied
MemberInfo memberInfo = memberMap.MemberInfo;
memberMap.SetShouldSerializeMethod(entity =>
{
// Get value of memberInfo
var member = memberInfo switch
{
FieldInfo field => field.GetValue(entity),
PropertyInfo property => property.GetValue(entity),
_ => null
};
if (member is IEnumerable collection)
{
// Check if collection is empty
return collection.GetEnumerator().MoveNext();
}
return false;
});
}
}