为什么在查询中使用$返回与$不同的结果或与mongodb进行相等检查

时间:2014-10-31 01:37:53

标签: mongodb mongodb-query

当对我们的数据库运行一些查询时,我们遇到了一些奇怪的结果:

db.transactions.count({$or: [{action: 'sell', action: 'buy'}]})

返回241485

db.transactions.count({$and:[{dateTime: {$gt: startDateTime}},
                             {$or: [{action: 'sell'}, {action: 'buy'}]}]})

返回320487

换句话说,添加$和子句,结果比没有结果更多。 在我们查看文档之前,我们无法理解这一点,并说:

  

$或与$ in

     

当使用$或使用$是对相同字段的值进行相等检查时,请使用$ in运算符而不是$或运算符。

然后我们将$或查询转换为$ in查询

db.transactions.count({action: {$in:['sell','buy']}})

并返回527475,这是有意义的结果(我们还计算出售和单独购买)

我们想知道为什么会出现这种情况,并且这是一个规则,而不是在处理相同字段值的等式检查时,我们应该始终使用$ in运算符?

1 个答案:

答案 0 :(得分:2)

您的$or查询不正确。你打破了一个基本的"哈希/地图"通过两次定义相同的密钥来规则:

db.transactions.count({$or: [{action: 'sell', action: 'buy'}]})

所以这只考虑action: 'buy',因为这会覆盖以前的密钥。与此相同:

db.transactions.count({$or: [{ action: 'buy'}]})

应该是这样,就像你第二次做的那样:

db.transactions.count({$or: [{action: 'sell' } , { action: 'buy'}]})

没有其他条件,因此等同于$in的缩短版本:

db.transactions.count({ "action": { "$in": [ 'sell','buy' ] } })

所以最初的问题就出现了,而且所有的陈述都不相同。