如何在Perl中编写MongoDB的$exists查询?结果不一致求助
解决Perl中MongoDB $exists查询结果不一致的问题
我来帮你搞定这个问题!你遇到的核心问题是给$exists传了字符串值,而不是布尔值,这导致MongoDB的查询逻辑和你预期的完全不一样。
问题根源对比
先看你原来的MongoDB Shell查询:
db.getCollection('Subscriber').find({ $and: [ {"registerFrom":{$exists:false}}, {"googleRegistrationId":{$exists:true}}, {"isGuest":"false"} ] })
这里$exists用的是布尔类型的false和true,用来判断字段是否存在。
但你的Perl代码里写成了:
{registerFrom => { '$exists' => 'false'}}, {googleRegistrationId => {'$exists' => 'true'}}
这里传的是字符串'false'和'true',MongoDB会把它们当作普通字符串值去匹配,而不是判断字段是否存在——这就是结果不一致的原因!
修正后的Perl代码
你只需要把$exists的参数改成Perl里的布尔值(0代表false,1代表true),或者用boolean模块的常量:
方式1:用数字布尔值(无需额外模块)
my $Subscriber2 = $Subscriber->find({ '$and' => [ { dateOfJoining => { '$gt' => $date } }, { registerFrom => { '$exists' => 0 } }, # 布尔false,判断字段不存在 { googleRegistrationId => { '$exists' => 1 } }, # 布尔true,判断字段存在 { isGuest => 'false' } # 这个是字符串匹配,和原查询一致,没问题 ] })->fields({ _id => 1, streamzCampaigns => 1 });
方式2:用boolean模块(更直观,和Shell写法一致)
如果你希望代码和MongoDB Shell的写法更贴近,可以导入boolean模块使用true/false常量:
use boolean; my $Subscriber2 = $Subscriber->find({ '$and' => [ { dateOfJoining => { '$gt' => $date } }, { registerFrom => { '$exists' => false } }, { googleRegistrationId => { '$exists' => true } }, { isGuest => 'false' } ] })->fields({ _id => 1, streamzCampaigns => 1 });
额外小提示
其实MongoDB的查询中,多个顶级条件默认就是逻辑与(AND),所以你可以省略$and,代码会更简洁:
my $Subscriber2 = $Subscriber->find({ dateOfJoining => { '$gt' => $date }, registerFrom => { '$exists' => 0 }, googleRegistrationId => { '$exists' => 1 }, isGuest => 'false' })->fields({ _id => 1, streamzCampaigns => 1 });
这个写法和带$and的逻辑完全一致,结果也会相同。
内容的提问来源于stack exchange,提问作者BASAVARAJ JM
相关产品推荐
相关产品推荐

