Description
I'm attempting to use the new 2.4.2 LINQ features in the aggregation pipeline, but my data structures use a lot of dictionaries that need to be unwound. It looks like the driver does not support $unwind generation for dictionaries. Aggregation stage {$unwind : "$TestDictionary" } words wonders in the shell, but calling the query.ToString() function below throws a System.NotSupportedException:
The collection selector's serializer must implement IBsonArraySerializer: aggregate([]).OfType().Where(to => (to.Name == "TestName")).SelectMany(to => to.TestDictionary) |
So I need to pull the whole dictionary locally and then parse it from there. It's not ideal, but there's a workaround. Am I missing something in the attributes or data structure that would allow this to work? If truly not supported, is there a plan to support $unwind via LINQ for Dictionary objects?
Data storage object:
public class TestObject |
{
|
public string Name {get;set;}; |
[BsonDictionaryOptions( DictionaryRepresentation.ArrayOfArrays )]
|
public Dictionary<string,string> TestDictionary { get; set; } = new Dictionary<string, string>(); |
}
|
Aggregation query:
var query = MongoCollection.AsQueryable()
|
.OfType<TestObject>()
|
.Where( to => to.Name == "TestName" ) |
.SelectMany( to => to.TestDictionary );
|
|
|
string queryText = query.ToString();
|