当对我们的数据库运行一些查询时,我们遇到了一些奇怪的结果:
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运算符?
答案 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' ] } })
所以最初的问题就出现了,而且所有的陈述都不相同。