Find documents with arrays not containing a document with a particular field value in MongoDB

Solution 1:

Using $nin will work, but you have the syntax wrong. It should be:

db.collection.find({'docs.foo': {$nin: [1]}})

Solution 2:

Use the $ne operator:

db.collection.find({'docs.foo': {$ne: 1}})

Update: I'd advise against using $nin in this case.

{'docs.foo': {$ne: 1}} takes all elements of docs, and for each of them it checks whether the foo field equals 1 or not. If it finds a match, it discards the document from the result list.

{'docs.foo': {$nin: [1]}} takes all elements of docs, and for each element it checks whether its foo field matches any of the members of the array [1]. This is a Cartesian product, you compare an array to another array, each element to each element. Although MongoDB might be smart and optimize this query, I assume you only use $nin because "it has do to something with arrays". But if you understand what you do here, you'll realize $nin is superfluous, and has possibly subpar performance.