我正在尝试使用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
运算符时,我才会失去...
我已经尝试取出整个$和条款,但仍然没有。我在4节点分片设置和MongoDB-0.700.0 perl驱动程序上使用MongoDB v2.4.3。
关于我哪里出错的指示?我应该提供的任何其他信息?
非常感谢提前!!
答案 0 :(得分: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
如果您尝试在shell中运行此查询,并使用explain,会发生什么?收藏有多大?
编辑:
您的日志中的这一点很有趣:
$nin: [ [ "Please", "Help", "stackoverflow", "friends" ] ]
你有一个包含数组的数组,但它应该是:
$nin: [ "Please", "Help", "stackoverflow", "friends" ]
你确定你的阵列有你的想法吗?