MongoDB C# - Getting BsonDocument for an Element that doesn't exist

后端 未结 5 1091
难免孤独
难免孤独 2021-02-09 07:53

So I have a BsonDocument b (let\'s say it has FirstName, LastName, Age), which you could access as b[\"FirstName\"], etc...

If I try to do b[\"asdfasdf\"] (which doesn\'

相关标签:
5条回答
  • 2021-02-09 08:20

    With the C# driver version 2, it might not be enough to check the existence of the field. The line:

    var firstName = report.GetValue("FirstName", null);
    

    will return a BsonNull object if FirstName is actually null in the db, when in fact you'd like to get a string. One way to take this into consideration in a one line code is:

    BsonDocument document;
    string firstName = ((Func<BsonDocument, string>)(d => { var v = d.GetValue("FirstName", null); return v.IsBsonNull ? null : v.AsString; }))(document);
    
    0 讨论(0)
  • 2021-02-09 08:22

    There is also an overload that lets you provide a default value:

    BsonDocument document;
    var firstName = (string) document["FirstName", null];
    // or
    var firstName = (string) document["FirstName", "N/A"];
    

    which is slightly more convenient that using Contains when all you want to do is replace a missing value with a default value.

    Edit: since the 2.0.1 version, it has been deprecated in favor of GetValue:

    var firstName = document.GetValue("FirstName", new BsonString(string.Empty)).AsString;
    
    0 讨论(0)
  • 2021-02-09 08:24

    Try the Contains method:

    var b = new BsonDocument();
    var exists = b.Contains("asdfasdf");
    
    0 讨论(0)
  • 2021-02-09 08:38

    An update to Robert's answer, the correct syntax using the C# 2.0 driver is:

    var firstName = report.GetValue("FirstName", null);
    
    0 讨论(0)
  • 2021-02-09 08:46

    You can use:

    var GoodItems = Query.Exists("FirstName");
    

    and than query

    People.Find(GoodItems);
    

    That way you'll get only the items that has "FirstName" defined.

    0 讨论(0)
提交回复
热议问题