MongoDB $setEquals Operator

Beginner
5 min read
Updated: Oct 2026
3 examples
Live preview

What Is $setEquals?

$setEquals is a MongoDB aggregation expression that returns true when two or more arrays contain the same unique elements as sets. Order and duplicates do not matter.

Remember
$setEquals = same unique elements?

{ $setEquals: [ <array1>, <array2>, ... ] }

[1, 2, 3] vs [3, 2, 1]     → true
[1, 2, 2] vs [2, 1]         → true
[1, 2]    vs [1, 2, 3]      → false

order ignored · duplicates ignored
null / missing arg → null

vs $eq: order matters for $eq
UsePrefer
Same elements as a set$setEquals
Same array, same order$eq
Shared elements only$setIntersection

How to Use $setEquals in MongoDB

Pass two or more array expressions and read the boolean result.

  1. Choose an expression stage ($addFields or $project).
  2. Pass the arrays to compare (fields and/or literals).
  3. Store or filter on the true / false result.
  4. Use $eq instead when order must match exactly.
PieceRequired?Role
Array 1YesFirst set to compare
Array 2+YesOther sets (two or more total)
Result—true, false, or null

Pseudocode

Pseudocode
for each document:
    arrays = evaluate each argument
    if any array is null or missing:
        result = null
    else:
        sets = unique(elements) for each array
        result = (all sets are identical)
    emit { ..., field: result }

Cheat Sheet

Keep these facts handy while comparing arrays as sets.

TopicDetail
TypeAggregation expression (returns boolean)
Syntax{ $setEquals: [ a, b, ... ] }
OrderIgnored
DuplicatesIgnored
vs $eqSet equality vs positional equality
Null argResult null
Sample["quiz","math"] ≡ ["math","quiz"]

Live Preview

Compare two arrays with set rules (order and duplicates ignored).

Simulates { $setEquals: [a, b] } and shows $eq for contrast.

Result
a = ["quiz", "math"]
b = ["math", "quiz"]

$setEquals → true
$eq        → false

(reason: same unique values; different order)

Worked Walkthrough — Required Skills

Asha has skills math and quiz. The required list is the same skills in a different order. As sets, they match.

Calculation
skills   = ["math", "quiz"]
required = ["quiz", "math"]

unique(skills)   = { math, quiz }
unique(required) = { math, quiz }

$setEquals → true

$eq(skills, required) → false
  (order differs: math≠quiz at index 0)

MongoDB Examples

We use one student with a skills list and a required list. First insert the sample, then compare with $setEquals, then contrast with $eq. Run these in mongosh after inserting the sample data once.

Example 1 — Sample Data

Imagine student Asha with skills ["math", "quiz"] and required ["quiz", "math"]. We save the document in students.

mongosh
db.students.insertOne({
  _id: 1,
  name: "Asha",
  skills: ["math", "quiz"],
  required: ["quiz", "math"]
});

How the Data Is Stored in MongoDB

After the insert, MongoDB keeps one document in students. Run find() to see it:

mongosh
db.students.find()

Read that document like this:

Field in MongoDBValuePlain English
_id1Document id
name"Asha"Student name
skills["math", "quiz"]What she has
required["quiz", "math"]What the course needs
Picture
skills:   math, quiz
required: quiz, math

same bag of unique values → $setEquals true

How It Works

  1. Insert once. insertOne adds Asha’s document to students.
  2. Two arrays, same members. Only the order differs.
  3. find() shows the same shape. Ready for Example 2.

Example 2 — Set Equality

Goal: add matchesRequired = $setEquals of skills and required.

mongosh
db.students.aggregate([
  {
    $addFields: {
      matchesRequired: {
        $setEquals: ["$skills", "$required"]
      }
    }
  }
]);

How It Works

  1. Read both arrays. Still using the skills/required lists from Example 1.
  2. Treat as sets. Unique values are {math, quiz} on both sides.
  3. Return true. $addFields writes matchesRequired: true.

Example 3 — Contrast with $eq

Same document, but also compare with $eq so you can see ordered vs set equality.

mongosh
db.students.aggregate([
  {
    $addFields: {
      asSets: { $setEquals: ["$skills", "$required"] },
      asArrays: { $eq: ["$skills", "$required"] }
    }
  }
]);

How It Works

  1. Set view. $setEquals ignores order → true.
  2. Array view. $eq checks index 0: "math" ≠ "quiz" → false.
  3. Pick the right tool. Use sets when membership matters; use $eq when sequence matters.

Edge Cases & Pitfalls

Check these before treating arrays as sets in production.

order

Order never matters

If sequence is part of the business rule, use $eq, not $setEquals.

dupes

Duplicates are ignored

[1, 1, 2] equals [2, 1]. Counts do not matter—only unique membership.

null

Null args → null

A missing or null array makes the whole result null, not false.

type

Arguments must be arrays

Non-array inputs error. Validate or default with $ifNull when fields may be missing.

Performance Notes

ApproachCostBest for
$setEquals on small arraysCheap set compareTags / skills checks
Huge arraysGrows with unique sizeKeep lists lean
$eq when order mattersSimple positional checkExact array equality

Comparing short tag lists is inexpensive. Filter early with $match when only some documents need the check.

Key Takeaways

  • Role: same unique elements across arrays?
  • Ignores: order and duplicates.
  • vs $eq: membership vs exact sequence.
  • Sample: ["math","quiz"] ≡ ["quiz","math"].

One line: $setEquals answers “do these arrays hold the same unique values, regardless of order?”

Frequently Asked Questions

$setEquals returns true when the input arrays contain the same set of unique elements, and false otherwise. Order and duplicate values are ignored—so [1, 2, 3] and [3, 2, 1] are equal.
Use { $setEquals: [ <array1>, <array2>, ... ] }. You can compare two or more arrays. Each argument must be an array expression (field path or literal).
No. It uses set semantics. Only which unique values are present matters, not order or how many times a value repeats.
$eq compares arrays position by position, so [1, 2] and [2, 1] are not equal. $setEquals treats them as the same set and returns true.
If any argument is null or refers to a missing field, $setEquals returns null.
Yes. Pass three or more arrays. All of them must represent the same set for the result to be true.

Next: $setField

Add or replace a field on an embedded document by name.

$setField tutorial →

About the author

Mari Selvan M P
Mari Selvan M P 🔗

Developer, cloud engineer, and technical writer

  • Experience 12 years building web and cloud systems
  • Focus Full Stack Development, AWS, and Developer Education

I write practical tutorials so students and working developers can learn by doing—from databases and APIs to deployment on AWS.

9 people found this page helpful