Introduction to MongoDB $setUnion Operator
$setUnion
is an aggregation operator in MongoDB that merges two arrays into a single array and removes duplicates.
Syntax
The syntax for $setUnion
is as follows:
{ $setUnion: [ <array1>, <array2>, ... ] }
Here, <array1>
and <array2>
are the arrays that need to be merged.
Use Cases
$setUnion
can be used in scenarios where we need to merge two arrays into one and remove duplicates, such as:
- Merging multiple tag arrays into a unique tag list.
- Merging the friend lists of two users into a unique friend list.
Example
Suppose we have a users
collection that stores user data, and each document contains the following fields:
{
"_id" : ObjectId("61f3c8e1572a6a846a6a5f0f"),
"name" : "Alice",
"hobbies" : [ "reading", "dancing", "travelling" ]
}
Now, we want to query the hobbies of all users, as well as a unique list of hobbies. We can use the following aggregation pipeline:
db.users.aggregate([
{
$group: {
_id: null,
hobbies: { $push: "$hobbies" }
}
},
{
$project: {
_id: 0,
hobbies: {
$reduce: {
input: "$hobbies",
initialValue: [],
in: { $setUnion: "$$value" }
}
}
}
}
])
In the above aggregation pipeline, we first use $group
to put all user hobbies into an array, and then use $reduce
and $setUnion
to merge these arrays into a unique list of hobbies.
Here are the sample data and results:
Sample Data:
_id |
name |
hobbies |
---|---|---|
ObjectId(“61f3c8e1572a6a846a6a5f0f”) | Alice | [“reading”, “dancing”, “travelling”] |
ObjectId(“61f3c8e2572a6a846a6a5f10”) | Bob | [“reading”, “painting”] |
ObjectId(“61f3c8e3572a6a846a6a5f11”) | Carol | [“travelling”, “cooking”] |
Aggregation Result:
{ "hobbies" : [ "reading", "dancing", "travelling", "painting", "cooking" ] }
Conclusion
The $setUnion
operator is a very useful aggregation operator that can merge multiple arrays into a unique array. It can be applied to many scenarios, such as merging multiple tag arrays, merging multiple friend lists, etc.