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

时间:2016-06-14 14:55:31

标签: c# mongodb

我对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,则查询仅返回不包含的文档   字段。

2 个答案:

答案 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); 

最初,我没有意识到BsonNullValue属性。

答案 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?

以此类推。 可能会更容易