Can you provide a sample test case? This seems to work for me:
db.foo.save({a: [ {n: 1, r: 10}, {n: 2, r: 10}]})
db.foo.save({a: [ {n: 1, r: 20}, {n: 2, r: 10}]})
db.foo.save({a: [ {n: 1, r: 30}, {n: 2, r: 10}]})
db.foo.find({a: { $not: {$elemMatch: {n: 1, r: 10 } } } })
Returns:
{ "_id" : ObjectId("4df95e583247c06301302ec5"), "a" : [ { "n" : 1,
"r" : 20 }, { "n" : 2, "r" : 10 } ] }
{ "_id" : ObjectId("4df95e593247c06301302ec6"), "a" : [ { "n" : 1,
"r" : 30 }, { "n" : 2, "r" : 10 } ] }
That's correct.