Bird
Raised Fist0
MongoDBquery~20 mins

$nin for not in set in MongoDB - Practice Problems & Coding Challenges

Choose your learning style10 modes available

Start learning this pattern below

Jump into concepts and practice - no test required

or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Challenge - 5 Problems
🎖️
MongoDB $nin Master
Get all challenges correct to earn this badge!
Test your skills under time pressure!
query_result
intermediate
2:00remaining
Find documents where 'status' is NOT in a given set
Given a collection orders with documents containing a status field, which query returns all orders where the status is NOT 'shipped', 'delivered', or 'returned'?
MongoDB
db.orders.find({ status: { $nin: ['shipped', 'delivered', 'returned'] } })
Adb.orders.find({ status: { $not: { $in: ['shipped', 'delivered', 'returned'] } } })
Bdb.orders.find({ status: { $in: ['shipped', 'delivered', 'returned'] } })
Cdb.orders.find({ status: { $nin: ['shipped', 'delivered', 'returned'] } })
Ddb.orders.find({ status: { $ne: ['shipped', 'delivered', 'returned'] } })
Attempts:
2 left
💡 Hint
Use $nin to exclude documents where the field matches any value in the array.
🧠 Conceptual
intermediate
1:30remaining
Understanding $nin behavior with missing fields
What happens when you use $nin on a field that does not exist in some documents?
ADocuments missing the field are included only if $exists is true.
BDocuments missing the field are excluded because $nin requires the field to exist.
CDocuments missing the field cause a query error.
DDocuments missing the field are included because their value is not in the $nin array.
Attempts:
2 left
💡 Hint
Think about how MongoDB treats missing fields in queries.
📝 Syntax
advanced
1:30remaining
Identify the syntax error in $nin usage
Which of the following MongoDB queries has a syntax error when using $nin?
Adb.collection.find({ age: { $nin: [25, 30, 35] } })
Bdb.collection.find({ age: { $nin: 25, 30, 35 } })
Cdb.collection.find({ age: { $nin: ['25', '30', '35'] } })
Ddb.collection.find({ age: { $nin: [] } })
Attempts:
2 left
💡 Hint
Check the syntax of the array passed to $nin.
optimization
advanced
2:00remaining
Optimizing a query using $nin with indexes
You have a large collection with an index on the category field. Which query is more efficient to find documents where category is NOT 'A', 'B', or 'C'?
Adb.products.find({ category: { $nin: ['A', 'B', 'C'] } })
Bdb.products.find({ category: { $ne: 'A' }, category: { $ne: 'B' }, category: { $ne: 'C' } })
Cdb.products.find({ category: { $not: { $in: ['A', 'B', 'C'] } } })
Ddb.products.find({ category: { $nin: ['A', 'B', 'C'] }, category: { $exists: true } })
Attempts:
2 left
💡 Hint
Consider how MongoDB uses indexes with $nin versus multiple $ne conditions.
🔧 Debug
expert
2:30remaining
Why does this $nin query return unexpected results?
A developer runs this query:
db.users.find({ roles: { $nin: ['admin', 'moderator'] } })
But it returns users who have 'admin' role. Why?
ABecause 'roles' is an array field, $nin checks if the entire array is not in the list, not individual elements.
BBecause $nin does not work on array fields at all.
CBecause the query syntax is invalid and MongoDB ignores $nin.
DBecause the roles field contains null values which match $nin.
Attempts:
2 left
💡 Hint
Think about how $nin behaves with array fields.

Practice

(1/5)
1. What does the MongoDB operator $nin do in a query?
easy
A. Selects documents where the field's value is in the specified array
B. Selects documents where the field's value is NOT in the specified array
C. Updates documents with values in the specified array
D. Deletes documents where the field's value is in the specified array

Solution

  1. Step 1: Understand the purpose of $nin

    The $nin operator is used to filter documents where a field's value is NOT included in a given list of values.
  2. Step 2: Compare with other operators

    Unlike $in which selects values inside the array, $nin excludes those values.
  3. Final Answer:

    Selects documents where the field's value is NOT in the specified array -> Option B
  4. Quick Check:

    $nin excludes values = B [OK]
Hint: Remember: $nin means NOT in list [OK]
Common Mistakes:
  • Confusing $nin with $in
  • Thinking it updates or deletes documents
  • Using it to select values inside the array
2. Which of the following is the correct syntax to find documents where the field status is NOT 'active' or 'pending' using $nin?
easy
A. { status: { $nin: ['active', 'pending'] } }
B. { status: { $nin: 'active', 'pending' } }
C. { status: { $nin: ['active'] || ['pending'] } }
D. { status: { $nin: 'active' && 'pending' } }

Solution

  1. Step 1: Check the correct $nin syntax

    The $nin operator requires an array of values inside square brackets to specify the excluded set.
  2. Step 2: Validate each option

    { status: { $nin: ['active', 'pending'] } } correctly uses an array with two strings. Options B, C, and D have syntax errors or invalid expressions.
  3. Final Answer:

    { status: { $nin: ['active', 'pending'] } } -> Option A
  4. Quick Check:

    Correct array syntax for $nin = A [OK]
Hint: Use square brackets for arrays in $nin [OK]
Common Mistakes:
  • Using multiple arguments instead of an array
  • Using logical operators inside $nin
  • Missing square brackets around values
3. Given the collection products with documents:
{ name: 'Pen', category: 'stationery' }
{ name: 'Apple', category: 'fruit' }
{ name: 'Notebook', category: 'stationery' }
{ name: 'Carrot', category: 'vegetable' }

What will be the result of this query?
db.products.find({ category: { $nin: ['fruit', 'vegetable'] } })
medium
A. All documents returned
B. [{ name: 'Apple', category: 'fruit' }, { name: 'Carrot', category: 'vegetable' }]
C. [] (empty array)
D. [{ name: 'Pen', category: 'stationery' }, { name: 'Notebook', category: 'stationery' }]

Solution

  1. Step 1: Understand the $nin filter

    The query excludes documents where category is 'fruit' or 'vegetable'.
  2. Step 2: Identify matching documents

    Documents with category 'stationery' are not in ['fruit', 'vegetable'], so they match. 'Pen' and 'Notebook' have 'stationery'.
  3. Final Answer:

    [{ name: 'Pen', category: 'stationery' }, { name: 'Notebook', category: 'stationery' }] -> Option D
  4. Quick Check:

    Exclude 'fruit' and 'vegetable' = stationery items only [OK]
Hint: Exclude unwanted categories with $nin array [OK]
Common Mistakes:
  • Confusing $nin with $in
  • Expecting documents with excluded categories
  • Assuming empty result when some match
4. You wrote this query to exclude users with roles 'admin' or 'moderator':
db.users.find({ role: { $nin: 'admin', 'moderator' } })

But it throws an error. What is the problem?
medium
A. The $nin operator requires an array, not multiple arguments
B. The field name role is misspelled
C. The query should use $in instead of $nin
D. MongoDB does not support $nin operator

Solution

  1. Step 1: Check $nin syntax

    $nin expects a single array argument listing values to exclude.
  2. Step 2: Identify the error in the query

    The query passes two separate string arguments instead of one array, causing syntax error.
  3. Final Answer:

    The $nin operator requires an array, not multiple arguments -> Option A
  4. Quick Check:

    $nin needs array input = C [OK]
Hint: Always wrap values in an array for $nin [OK]
Common Mistakes:
  • Passing multiple arguments instead of an array
  • Using wrong operator $in by mistake
  • Assuming $nin is unsupported
5. You have a collection orders with documents:
{ orderId: 1, status: 'shipped' }
{ orderId: 2, status: 'pending' }
{ orderId: 3, status: 'cancelled' }
{ orderId: 4, status: 'delivered' }

You want to find orders NOT in statuses 'pending' or 'cancelled' AND exclude orders with orderId 4. Which query correctly uses $nin to achieve this?
hard
A. { status: { $nin: ['pending', 'cancelled'] }, orderId: { $ne: 4 } }
B. { status: { $nin: ['pending', 'cancelled', 4] } }
C. { status: { $nin: ['pending', 'cancelled'] }, orderId: { $nin: [4] } }
D. { status: { $nin: ['pending', 'cancelled'] }, orderId: { $in: [4] } }

Solution

  1. Step 1: Exclude statuses 'pending' and 'cancelled'

    Use { status: { $nin: ['pending', 'cancelled'] } } to exclude these statuses.
  2. Step 2: Exclude orderId 4 using $nin

    Use { orderId: { $nin: [4] } } to exclude orderId 4 as well.
  3. Step 3: Combine conditions

    Both conditions together filter out unwanted statuses and orderId 4.
  4. Final Answer:

    { status: { $nin: ['pending', 'cancelled'] }, orderId: { $nin: [4] } } -> Option C
  5. Quick Check:

    Use $nin on both fields = A [OK]
Hint: Use separate $nin for each field to exclude multiple sets [OK]
Common Mistakes:
  • Putting orderId inside status array
  • Using $ne instead of $nin for multiple values
  • Using $in to exclude values