Unwind
Last updated
Last updated
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.
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();
SelectMany
on Activities creates the $unwind stage
new { }
creates the $project stage
GroupBy
groups documents by age field
Select
creates 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