Uploaded image for project: 'C# Driver'
  1. C# Driver
  2. CSHARP-2149

A class inside an embedded array is not being serialized when Projection.ElemMatch is used

    XMLWordPrintable

    Details

    • Type: Bug
    • Status: Closed
    • Priority: Critical - P2
    • Resolution: Works as Designed
    • Affects Version/s: 2.4.4, 2.5
    • Fix Version/s: None
    • Component/s: Read Operations
    • Labels:
      None
    • Environment:
      windows 7sp1, visual studio 2017, driver 2.4.4, 2.5.0, server 3.4.10

      Description

      A class inside an embedded array is not being serialized when Projection.ElemMatch is used

      I have classes like this:

      	internal class AccountDal
          {
              public Guid Id { get; set; }
      		// more properties 
      		
              public List<AccountMemberDal> Members { get; set; }
          }
       
      	internal class AccountMemberDal
          {
              public RegisteredEntityDal Member { get; set; }
              public EAccountPermissions Permissions { get; set; } // some enum
              public bool IsAdmin { get; set; }
              public bool IsDefaultAccount { get; set; }
          }
      	
      	public class RegisteredEntityDal
          {
              public Guid Id { get; set; }
              public EEntityTypeDal Type { get; set; } // some enum
      	}
      

      I constructed a query:

      FilterDefinition<AccountDal> filter = Builders<AccountDal>.Filter.And(
                      Builders<AccountDal>.Filter.Eq(a => a.IsBusiness, true),
                      Builders<AccountDal>.Filter.ElemMatch(a => a.Members, Builders<AccountMemberDal>.Filter
                      .And(
                          Builders<AccountMemberDal>.Filter.Eq(a => a.IsAdmin, true),
                          Builders<AccountMemberDal>.Filter.Eq(a => a.IsDefaultAccount, false)
                          ))
                      );
       
      	ProjectionDefinition<AccountDal, AccountMemberDal> project = Builders<AccountDal>
              .Projection.ElemMatch(
                          a => a.Members, Builders<AccountMemberDal>.Filter.And(
                          Builders<AccountMemberDal>.Filter.Eq(a => a.IsAdmin, true),
                          Builders<AccountMemberDal>.Filter.Eq(a => a.IsDefaultAccount, false)
                          ));
      // or
      // ProjectionDefinition<AccountDal, AccountMemberDal> project = Builders<AccountDal>
      // .Projection.Include(a => a.Members[-1]);
      // which one is recommendes?
      	
      //and execute the query:
      IMongoCollection<AccountDal> accounts = DbGeneralContext.Accounts;
      var result = await accounts.Find(filter).Project(project).ToListAsync();
       
      // the query that is being generated is:
      db.accounts.find({ "isBusiness" : true, "members" : { "$elemMatch" : { "isAdmin" : true, "isDefaultAccount" : false } } },{ "members" : { "$elemMatch" : { "isAdmin" : true, "isDefaultAccount" : false } } })
      

      with the following result:

      {
              "_id" : BinData(4,"KKExCpz25hGbRAAkmxAf2Q=="),
              "members" : [
                      {
                              "member" : {
                                      "id" : BinData(4,"Y+gHIJv25hGbRAAkmxAf2Q=="),
                                      "type" : 1
                              },
                              "permissions" : 1,
                              "isAdmin" : true,
                              "isDefaultAccount" : false
                      }
              ]
      }
      {
              "_id" : BinData(4,"L/pKS93w5hGfMgAkmxAf2Q=="),
              "members" : [
                      {
                              "member" : {
                                      "id" : BinData(4,"JAUR4Hbc5hGfyQAkmxAf2Q=="),
                                      "type" : 1
                              },
                              "permissions" : 1,
                              "isAdmin" : true,
                              "isDefaultAccount" : false
                      }
              ]
      }
      

      However the c# object does not serialize the 'Member' property and it remains null
      see attached 'account-member-result.png' result

      Thanks,
      Itzhak

        Attachments

          Activity

            People

            Assignee:
            wan.bachtiar Wan Bachtiar
            Reporter:
            itzikkg Itzhak Kagan
            Votes:
            0 Vote for this issue
            Watchers:
            3 Start watching this issue

              Dates

              Created:
              Updated:
              Resolved: