2015-10-06 61 views
3

如何在Perl中使用MongoDB進行多重排序?如何在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)排序。我做錯了什麼?

+0

對不起,忘記了標記。這裏是$ obj - > {markers} = [168,169] –

+0

歡迎使用Stack Overflow和Perl標記!你可以編輯你的問題,並通過問題左下角的[編輯]鏈接添加這些細節。請隨時參加[旅遊]以更熟悉該網站。 :) – simbabque

回答

2

這裏的基本問題是,Perl中的一個「散」是由「鑰匙」默認排序。爲了獲得「插入順序」你需要使用Tie::IxHash如下:

use Tie::IxHash; 

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

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

然後,當你使用這個在您的MongoDB的查詢中,密鑰在你插入的順序考慮,而不是他們的lexcial訂購。

應該已經orderd這樣好歹因爲鍵詞彙順序,但我建議你做錯了什麼,你需要知道的插入順序的反正。

否則理由是,「IN_STOCK」不存在,或者不是真正的路徑名到外地。您需要用"dot notation"指定該字段的完整路徑,否則路徑無效。

+0

謝謝,這是工作。但是,只有當我聲明這樣的「散列」時纔有效:$ sort - > {is_instock} = -1; $ sort - > {ua} = 1; –

+0

@ArtemBardachov如果按照圖示方式公佈,那麼對我來說工作得很好。所有關於'Tie:IxHash'的提及都是因爲這是散列被重新定義爲按照插入順序工作的唯一方式,正如BSON所預期的那樣(這是請求的最終序列化)。如前所述,默認的Perl哈希不遵循該順序。 –

+0

默認情況下,Perl中的散列根本不排序。 –

相關問題