Perl mongo->使用'$ in'运算符计算集合数

时间:2013-10-27 14:41:42

标签: perl mongodb count operators mongo-collection

我想知道是否可以使用perl MongoDB :: Collection模块从mongo shell中使用“in”运算符。我尝试了很多东西,但还没有得到我期待的结果。我已经检查了stackoverflow上的文档和其他帖子,但似乎无法找到任何具体的内容,除非我忽略了什么。

http://docs.mongodb.org/manual/reference/operator/query/in/

我通过mongo shell运行的计数查询是

mongo:PRIMARY> db.getCollection("Results").count( { TestClass : "TestClass", TestMethod : { $in: ["method1" , "method2", "method3"] } })
181605

我尝试了几种不同的方式将列表作为数组或散列引用或预构建字符串...

my $count = $mongo->{collection}->count({
                            'TimeStamp'     => { '$gt' => $ft, '$lt' => $tt },
                            'TestClass'     => $TestClass,
                            'TestMethod'    => { '$in' => [$whitelist->methods] },
                            'Result'        => $result
                    });

倾倒$whitelist->methods的地方

$VAR1 = {
      'method1' => 1,
      'method2' => 1,
      'method3' => 1
    };

我看起来很高和很低的答案,有没有人知道驱动程序目前是否能够像这样使用$ in运算符?从先前的查询循环返回的方法并将结果相加将需要更多的代码。

我见过的关于$ in运算符的唯一其他堆栈溢出帖是$in mongoDB operator with _id in perl建议使用http://api.mongodb.org/perl/current/MongoDB/OID.html但是我认为这与ID更相关。

非常感谢任何帮助或讨论。

1 个答案:

答案 0 :(得分:1)

问题是$in子句期望其值为数组引用,但是您将hashref(如Dumper的输出显示)提供给它。将后者变为前者的最简单方法是应用keys函数:

# ...
'TestMethod'    => { '$in' => [keys %{$whitelist->methods}] }

...或只是[keys $whitelist->methods],如果你使用的是Perl 5.14+,那么......

  

从Perl 5.14开始,keys可以采用标量EXPR,这必须是   包含对未经处理的散列或数组的引用