我该如何在Perl中使用mongodb按多个字段排序?

3

如何在Perl中使用MongoDB进行多重排序?

我的当前方法大致如下:

my $sort = {"is_instock" => -1, "ua" => 1};
my $resultSet = $collection
   ->find({moderated => 1, markers => {'$all'=>$obj->{markers}}})
   ->sort($sort)
   ->limit(25);
@{$result} = $resultSet->all;

但是,我得到的数组是按照一个字段(ua)排序的。我做错了什么?


抱歉,忘记了标记。这里是 $obj->{markers} = [168,169]。 - Artem Bardachov
欢迎来到 Stack Overflow 和 Perl 标签!您可以使用问题左下角的 [edit] 链接编辑您的问题并添加这些细节。请随意参观 [tour] 以更加熟悉本网站。 :) - simbabque
1个回答

3
基础问题在于,Perl中的“哈希”默认按“键”排序。为了获得“插入顺序”,您需要使用Tie::IxHash,如下所示:
use Tie::IxHash;

my %sort;
tie ( %sort, 'Tie::IxHash' );

my $sort = \%sort;
$sort  =  { "is_instock" => -1, "ua" => 1 };

当您在MongoDB查询中使用此方式时,键将按照插入的顺序而非字典顺序考虑。这本应该是这种方式排序的,因为键是按字典顺序排列的,但我建议您检查一下自己的操作是否正确,并且需要了解插入顺序。

另一个原因是不存在“in_stock”,或者它不是字段的真实路径名称。您需要使用“点符号表示法”指定字段的完整路径,否则路径无效。


谢谢,它可以工作。但是只有当我像这样声明“哈希”时才能工作:$sort->{is_instock} = -1; $sort->{ua} = 1; - Artem Bardachov
@ArtemBardachov 如果按照所示精确声明,则对我来说运行良好。正如提到的那样,这完全取决于 Tie:IxHash,因为这是重新定义哈希以按预期的插入顺序工作的唯一方法,而 BSON 则是请求最终序列化的方式。默认的 Perl 哈希表不遵循该顺序,这已经说明了。 - Blakes Seven
在 Perl 中,默认情况下哈希表并不会被排序。 - Alexander Hartmaier
这个帮了我很多,谢谢 @BlakesSeven - the_ccalderon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接