我有一个非常简单的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属性.
小智 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)
等等。可能会更容易