 <p>You have an quite common mistake.</p> <p>In your collection, the field is named <code>listname</code> (note the lowercase) whereas in your query the field is name <code>listName</code> (note the camel case). Field names are case sensitive. so when adjusting the first query to</p> <pre><code>db.testcol.find({ "msgs.listname": { "$nin":[ "list1" ] } }).pretty() </code></pre> <p>you get the expected result.</p> <p><strong>EDIT</strong></p> <p>As @NeilLunn correctly pointed out in the comments, the better approach when ruling out a <strong>single</strong> value as per the question would be:</p> <pre><code>db.testcol.find({ "msgs.listname": { "$ne": "list1" } }) </code></pre> <p>This approach is both cleaner and faster when just a single value needs to be ruled out.</p> <p>All kudos to him.</p>