2016-06-08 69 views
0

当字段不存在或当该字段的子字段满足某些条件时,我需要查找文档。Mongodb查询 - 仅当字段存在时将条件应用于子字段

在这里问了一个类似的问题:Mongodb query - apply condition only if field exists。我将使用代码从这个答案来说明:

db.stackoverflow.find({ 
    $or: [ 
    { howmuch: { $exists:false } }, 
    { 'howmuch.chocolate':5 } 
    ]}) 

当然,当我这样做,我得到一个错误,当howmuch是不确定的。我知道我可以测试是否存在'howmuch.chocolate',但这不会改变任何事情。有没有办法做到这一点?

+1

你会得到什么错误? – chridam

回答

2

这应该工作:

db.stackoverflow.find({ 
    $or: [ 
    { howmuch: { $exists:false } }, 
    { $and: [{ 'howmuch.chocolate': { $exists: true } } ,{ 'howmuch.chocolate':5 }]} 
    ]}) 

按照documentation,如果$and阵列中的第一个表达式评估为假,剩余表达式不被评估。

+1

为什么这应该工作,如果OP的查询失败?也许我在这里错过了一些东西。 – styvane

+0

@ user3100115使用'$和'运算符,将会阻止错误,因为将首先执行字段检查,如果失败,则不会评估第二部分(导致错误的部分)。 – ZeMoon

+0

我想到了这一点,但错过了那个说如果第一个表达式的计算结果为false的部分,剩下的表达式就不会被评估。非常感谢!下次我会更仔细地阅读文档:) – 7hibault