【问题标题】:MongoDB query with perl with $and and $nin带有 $and 和 $nin 的 perl 的 MongoDB 查询
【发布时间】:2013-05-30 12:01:16
【问题描述】:

我正在尝试使用 MongoDB Perl 驱动程序对具有这种文档结构的集合进行查询:

{
    "_id" : ObjectId("519fcfa59fb9d97874000001"),
    "variant" : {
        "alt" : "T",
        "ref" : "C",
        "chr" : NumberLong(1),
        "pos" : NumberLong(13302),
        "rsID" : "rs180734498"
    },
    "genotype" : {
        "GT" : "0/0"
    },
    "sample" : {
        "ID" : NumberLong(8751),
        "tags" : [
            "hiseq",
            "exome",
            NumberLong(8751)
        ]
    }
}

这是我的 BAD perl 代码的 sn-p:

  my $hom_count = $exomevars->count({
    '$and' => [ {
          "variant.chr" => $chr,
          "variant.pos" => $pos,
          "variant.ref" => $ref,
          "variant.alt" => $alt,
          "genotype.GT" => qr/1\/1/,
          "sample.tags" => { '$nin' => \@these_tags }
          } ]
         });

我的收藏确实在这些字段上被索引 -

{
    "v" : 1,
    "key" : {
        "variant.chr" : 1,
        "variant.pos" : 1,
        "variant.ref" : 1,
        "variant.alt" : 1,
        "genotype.GT" : 1,
        "sample.tags" : 1
    },
    "ns" : "vars.exomevars",
    "name" : "variant.chr_1_variant.pos_1_variant.ref_1_variant.alt_1_genotype.GT_1_sample.tags_1"
}

...但是我的脚本挂起并且没有查询发生。我很确定这是我的问题是查询的 $nin/sample.tags 部分,如果我取出我的 \@these_tags 并硬编码一些这样的文本,它仍然没有查询就挂起......

"sample.tags" => { '$nin' => ["stuff","things"] },

还确保我的 @these_tags 数组与 Data::Dumper 一起使用 - 看来我做对了...

print Dumper \@these_tags;
    $VAR1 = [
              'Please',
              'help',
              'stackoverflow',
              'friends'
            ];

这不是qr/1\/1/ - 我以前使用过这个查询,它工作正常。例如,这是一个早期版本的脚本,我只是尝试基于单个字符串进行排除,这个查询效果很好:

  my $hom_count = $exomevars->count({
      '$and' => [ {
          "variant.chr" => $chr,
          "variant.pos" => $pos,
          "variant.ref" => $ref,
          "variant.alt" => $alt,
          "genotype.GT" => qr/1\/1/,
          "sample.ID" => { '$ne' => $this_sample }
          } ]
         });

只有当我将 sample.tags 数组添加到集合中,现在尝试使用 $nin 运算符时,我才迷路了……

我已经尝试取出整个 $and 子句,仍然没有。我在 4 节点分片设置和 MongoDB-0.700.0 perl 驱动程序上使用 MongoDB v2.4.3。

关于我哪里出错的任何指针?我应该提供任何其他信息吗?

提前非常感谢!!

【问题讨论】:

    标签: perl mongodb


    【解决方案1】:

    我没有尝试完整的查询,但$nin 绝对不是问题。使用您的示例文档,我能够运行这些:

    perl -MMongoDB -E 'say MongoDB::MongoClient->new->get_database( "so" )
    ->get_collection("vars")->count( { "sample.tags" => { "\$nin" => [ "hiseq", "foo" ] } } )'
    
    0
    
    perl -MMongoDB -E 'say MongoDB::MongoClient->new->get_database( "so" )
    ->get_collection("vars")->count( { "sample.tags" => { "\$nin" => [ "narf", "foo" ] } } )'
    
    1
    

    如果您尝试在 shell 中运行此查询并添加 explain,会发生什么情况?收藏有多大?

    编辑:

    您日志中的这一点很有趣:

    $nin: [ [ "Please", "Help", "stackoverflow", "friends" ] ]
    

    你有一个数组,里面有一个数组,但它应该是:

    $nin: [ "Please", "Help", "stackoverflow", "friends" ]
    

    你确定你的数组有你的想法吗?

    【讨论】:

    • 它是 318534850 个文档的集合...计数在 shell 中工作,解释是巨大的,所以它在 pastebin link
    • 好吧,看起来索引工作正常。当您从 Perl 运行查询时,mongod 日志中有什么有趣的事情吗?
    • 这是从 Perl 尝试时来自其中一个分片的日志:http://pastebin.com/cb90T1UQ
    • @caddymob,根据您的日志中的一些见解更新了答案。
    • 哎呀,那是我的错 - 我尝试了"sample.tags" => { '$nin' => [\@these_tags] },这就是输出。因此,让我们再试一次,不要使用最初发布的括号...Pastie3
    猜你喜欢
    • 1970-01-01
    • 2019-07-24
    • 1970-01-01
    • 1970-01-01
    • 2017-02-22
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多