1

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コードのスニペットです:

  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演算子 whelp を試してみたときだけです...

$and 句全体を取り出してみましたが、まだ何もありません。4 ノード シャード セットアップで MongoDB v2.4.3 と MongoDB-0.700.0 perl ドライバーを使用しています。

私が間違っていた場所へのポインタはありますか?提供すべき追加情報はありますか?

よろしくお願いします!

4

1 に答える 1

0

完全なクエリは試していませんが、$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

このクエリをシェルで実行して、Explainを追加するとどうなりますか? コレクションの大きさは?

編集:

あなたのログからのこのビットは興味深いです:

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

配列を含む配列がありますが、次のようにする必要があります。

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

あなたのアレイがあなたの考えを持っていると確信していますか?

于 2013-05-30T02:59:32.837 に答える