🚩Unwind

Array deconstruction

The $unwind operator is used to deconstruct array fields. How deconstruction works ❓ For each array element a new document is produced having that element in the position of the field array. This means that applying the unwind operator on a single document's array field which contains 10 elements, produces 10 different documents having one of the array elements instead of the array field. It is possible to define if a new document will produced in case a document either doesn't contain the array field or it is empty.

{
	"_id" : ObjectId("5e9afcd20f86e454c4518d8d"),
	"name" : "Margarett Lind",
	"age" : 59,
	"activities" : [
		"Golf",
		"Photography",
		"Hacking"
	]
}

The following sample finds the distinct activities grouped by age for Traveler documents.

Unwind.cs
var travelersQueryableCollection = tripsDatabase
    .GetCollection<Traveler>(Constants.TravelersCollection)
    .AsQueryable();

var linqQuery = travelersQueryableCollection
    .SelectMany(t => t.Activities, (t, a) => new
    {
        age = t.Age,
        activity = a
    })
    .GroupBy(q => q.age)
    .Select(g => new { age = g.Key, activities = 
        g.Select(a => a.activity).Distinct() })
    .OrderBy(r => r.age);

var linqQueryResults = await linqQuery.ToListAsync();

LINQ query explanation

  • SelectMany on Activities creates the $unwind stage

  • new { } creates the $project stage

  • GroupBy groups documents by age field

  • Selectcreates another $project stage where Distinct ensures activities will not contain duplicate values per group - it does that by using $addToSet operator in the $group stage rather than a $push

Last updated