Navigation
This version of the documentation is archived and no longer supported.

$not

On this page

$not

Syntax: { field: { $not: { <operator-expression> } } }

$not performs a logical NOT operation on the specified <operator-expression> and selects the documents that do not match the <operator-expression>. This includes documents that do not contain the field.

Consider the following query:

db.inventory.find( { price: { $not: { $gt: 1.99 } } } )

This query will select all documents in the inventory collection where:

  • the price field value is less than or equal to 1.99 or
  • the price field does not exist

{ $not: { $gt: 1.99 } } is different from the $lte operator. { $lte: 1.99 } returns only the documents where price field exists and its value is less than or equal to 1.99.

Remember that the $not operator only affects other operators and cannot check fields and documents independently. So, use the $not operator for logical disjunctions and the $ne operator to test the contents of fields directly.

Behavior

$not and Data Types

The operation of the $not operator is consistent with the behavior of other operators but may yield unexpected results with some data types like arrays.

$not and Regular Expressions

$not operator can perform logical NOT operation on:

  • Regular expression objects (i.e. /pattern/)

    For example, the following query selects all documents in the inventory collection where the item field value does not start with the letter p.

    db.inventory.find( { item: { $not: /^p.*/ } } )
    
  • $regex operator expression

    For example, the following query selects all documents in the inventory collection where the item field value does not start with the letter p.

    db.inventory.find( { item: { $not: { $regex: "^p.*" } } } )
    db.inventory.find( { item: { $not: { $regex: /^p.*/ } } } )
    
  • driver language’s regular expression objects

    For example, the following PyMongo query uses Python’s re.compile() method to compile a regular expression:

    import re
    for noMatch in db.inventory.find( { "item": { "$not": re.compile("^p.*") } } ):
        print noMatch
    
←   $and $nor  →