You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:09:55