检查MongoDb C#Driver 2.0中的字段是否等于空

VSO*_*VSO 9 c# mongodb

我有一个非常简单的mongo查询:

db.items.find( { MyFieldName: { $exists: true, $eq: null } } );
Run Code Online (Sandbox Code Playgroud)

不是需要解释它,而是找到具有MyFieldName该字段值的文件null.看起来这对C#驱动程序来说非常简单:

var fieldExistsFilter= Builders<BsonDocument>.Filter.Exists("MyFieldName", true);
var fieldValueIsNullFilter = Builders<BsonDocument>.Filter.Eq("MyFieldName", null); 
Run Code Online (Sandbox Code Playgroud)

但是,fieldValueIsNullFilter如果我尝试检查null,则第二个过滤器不会构建.如果我写"testString"或类似的东西,它工作正常,但不是null.

TL:博士; version:如何在MongoDb C#驱动程序中创建一个过滤器来检查字段是否为空?

注意,我检查了其他答案,他们建议$ exists做我想要的 - 它没有,按照mongo docs:

如果为true,则$ exists匹配包含该字段的文档,包括字段值为null的文档.如果为false,则查询仅返回不包含该字段的文档.

VSO*_*VSO 30

这实际上可以通过一点修改按预期工作,这取决于:

BsonNull.Value

有关详细信息,请参阅此问题: 如何使用C#官方驱动程序创建具有Null值的Bson文档?

所以查询是:

var fieldValueIsNullFilter = Builders<BsonDocument>.Filter.Eq("MyFieldName", BsonNull.Value); 
Run Code Online (Sandbox Code Playgroud)

起初,我并没有意识到BsonNull有一个Value属性.

  • 这是答案,你应该接受它作为答案。没有错。 (2认同)

小智 5

除了上面的注释之外,如果您有某个实体(取决于属性类型),您还可以这样写:

public class CustomEntity
{
    public string Id { get; set; }

    public string StringProperty { get; set; }

    public DateTime? DateTimeProperty { get; set; }
}


var filterIfStringPropertyNull = Builders<CustomEntity>.Filter.Eq(o => o.StringProperty, null); // if property is string

var filterIfDatePropertyNull = Builders<CustomEntity>.Filter.Eq(o => o.DateTimeProperty, BsonNull.Value.ToNullableUniversalTime());  // if property is DateTime?
Run Code Online (Sandbox Code Playgroud)

等等。可能会更容易