我对mongo有一个非常简单的查询:
db.items.find( { MyFieldName: { $exists: true, $eq: null } } );
不是需要解释它,而是找到具有MyFieldName
且该字段值为null
的文档。看起来使用C#驱动程序非常简单:
var fieldExistsFilter= Builders<BsonDocument>.Filter.Exists("MyFieldName", true);
var fieldValueIsNullFilter = Builders<BsonDocument>.Filter.Eq("MyFieldName", null);
但是,如果我尝试检查null,则第二个过滤器fieldValueIsNullFilter
不会构建。如果我写"testString"
或类似的东西,但是没有null,那么它可以正常工作。
TL:博士; version:如何在MongoDb C#驱动程序中创建一个过滤器来检查字段是否为空?
注意,我检查了其他答案,他们建议$ exists按我的要求行事 - 但不是mongo docs:
如果是,则$ exists匹配包含的文档 字段,包括字段值为空的文档。如果 如果为false,则查询仅返回不包含的文档 字段。
答案 0 :(得分:26)
这实际上可以通过一些修改来实现,具体取决于:
BsonNull.Value
有关详细信息,请参阅此问题: How to create Bson Document with Null value using C# official driver?
所以查询是:
var fieldValueIsNullFilter = Builders<BsonDocument>.Filter.Eq("MyFieldName", BsonNull.Value);
最初,我没有意识到BsonNull
有Value
属性。
答案 1 :(得分:0)
除了上面的注释,如果您有某些实体(取决于属性类型),还可以这样写:
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?
以此类推。 可能会更容易