使用$ elemMatch的$ nin不能按预期工作

时间:2014-08-04 13:54:23

标签: mongodb

我有来自mongodb网站的以下bios集合

http://docs.mongodb.org/manual/reference/bios-example-collection/

现在假设我需要找到所有赢得奖项的用户,但不是在2001年和2011年。

我正在尝试使用$ nin和$ in但是我得到了意想不到的结果

db.bios.count({awards: {$elemMatch:{ year:{ $nin:[2001,2011] } }}});
//returns 7 - not expected

db.bios.count({awards: {$elemMatch:{ year:{ $in:[2001,2011] } }}});
//returns  4 - expected

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您当前的$nin查询计算的文档中至少有一个awards数组元素包含2001年和2011年以外的年份。

使用不$nin的{​​{1}}来匹配任何元素中没有$elemMatch数组值的文档。

$nin

但是,这也包括没有任何 db.bios.count({'awards.year': {$nin:[2001,2011]}}); 条目的文档。因此,要计算至少有一个奖项(即赢得奖项的用户)的文档,但在2001年或2011年没有,您需要awards在限定符中确保$and至少有一个元素:

awards