Search code examples
c#mongodbmongodb-queryaggregation-frameworkmongodb-.net-driver

C# Mongo Driver error: Cannot deserialize a 'Int32' from BsonType 'Document'


Following MongoDB query run fine on Robo3T 1.2 and return correct 'count'.

db.runCommand( {
aggregate: "User",
pipeline: [
{$unwind: '$UserSubscriptions'},
{$group: {
    _id: '$_id',
    codes: {$addToSet: '$UserSubscriptions.Subscription.Publication'}
}},
{$unwind: '$codes'},
{$group: {
    _id: '$codes',
    count: {$sum: 1}
}}
]
} )

I m trying to convert above query to C# MongoDriver query like this

 var unwind = new BsonDocument { { "$unwind", "$UserSubscriptions" } };
        var group1 = new BsonDocument
            {
                { "$group",
                    new BsonDocument
                        {
                            { "_id", new BsonDocument
                                         {
                                             {
                                                 "Id","$_id"
                                             }
                                         }
                            },
                            {
                                "codes", new BsonDocument
                                             {
                                                 {
                                                     "$addToSet","$UserSubscriptions.Subscription.Publication.Code"
                                                 }
                                             }
                            }
                        }
              }
            };
        var unwindCode = new BsonDocument { { "$unwind", "$codes" } };
        var group2 = new BsonDocument
            {
                { "$group",
                    new BsonDocument
                        {
                            { "_id", new BsonDocument
                                         {
                                             {
                                                 "Id","$codes"
                                             }
                                         }
                            },
                            {
                                "codes", new BsonDocument
                                             {
                                                 {
                                                     "$sum",1
                                                 }
                                             }
                            }
                        }
              }
            };
        var pipeline = new[] { unwind, group1 , unwindCode , group2 };
    var result = coll.Aggregate<T>(pipeline);

But getting error Cannot deserialize a 'Int32' from BsonType 'Document'.

Id is a primary key in collection

public int Id { get; set; }

enter image description here

Please advise how to achieve this.

(Robo 3T 1.2.1) (MongoDB.Driver 2.4.4)


Solution

  • You are trying to deserialize a BsonDocument to 'Int32' by creating a BsonDocument for "_id". You just need to do this:

    var group1 = new BsonDocument
    {
        { 
            "$group", new BsonDocument
            {
                { 
                    "_id", "$_id"
                },
                {
                    "codes", new BsonDocument
                    {
                         {
                            "$addToSet", "$UserSubscriptions.Subscription.Publication.Code"
                         }
                    }
                }
            }
        }
    };
    
    var group2 = new BsonDocument
    {
        { 
            "$group", new BsonDocument
            {
                { 
                    "_id", "$codes"
                },
                {
                    "count", new BsonDocument
                    {
                         {
                            "$sum", 1
                         }
                    }
                }
            }
        }
    };