2012-01-18 113 views
0

對於我來說,我使用MongoDB的存儲一大堆來自50個國家的產品,在DB項目看起來是這樣的:使用基於關鍵AND值的PHP和MongoDB排序結果?

{ 
    _id: xxxxxxxxxxxxxxx, 
    country: 'au', 
    title: 'Equipment X', 
    price: 1000, 
}, 
{ 
    _id: xxxxxxxxxxxxxxy, 
    country: 'us', 
    title: 'Equipment Y', 
    price: 1000, 
}, 
... 
... 

我想知道,如果它是在所有可能的查詢所有產品並按照國家排序au FIRST,然後是其餘的產品。簡單的MongoDB排序似乎只按鍵排序。如果可能,是否涉及地圖/縮小?

編輯:更詳細的例子

文件中收集:

{ country:'cn', title:'Equipment A', price:'100'}, 
{ country:'au', title:'Equipment B', price:'100'}, 
{ country:'za', title:'Equipment C', price:'100'}, 
{ country:'us', title:'Equipment D', price:'100'}, 
{ country:'nz', title:'Equipment E', price:'100'}, 
{ country:'it', title:'Equipment F', price:'100'}, 
{ country:'nz', title:'Equipment G', price:'100'}, 
{ country:'au', title:'Equipment H', price:'100'}, 

我要尋找一種將返回產品新西蘭是在頂部,然後通過後續所有其他產品,如下所示:

{ country:'nz', title:'Equipment E', price:'100'}, 
{ country:'nz', title:'Equipment G', price:'100'}, 
{ country:'au', title:'Equipment B', price:'100'}, 
{ country:'au', title:'Equipment H', price:'100'}, 
{ country:'cn', title:'Equipment A', price:'100'}, 
{ country:'it', title:'Equipment F', price:'100'}, 
{ country:'us', title:'Equipment D', price:'100'}, 
{ country:'za', title:'Equipment C', price:'100'}, 

回答

2

通過在鍵排序,這意味着在一個鍵的值進行排序。這是你想要的,我想。 (離開開始部分連接到數據庫並選擇一個集合)。

$cursor = $collection->find(); 
$cursor->sort(array('country' => 1)) 

更新因此,這是你想要做什麼?

$cursor = $collection->find(array('country' => 'nz')); 
// process your nz products... 

$cursor = $collection->find(array('country' => array('$neq' => 'nz'))); 
// process the rest of your products... 

UPDATE2好吧,我想你可能需要求助於做這樣的事情,如果你真的需要這個功能。

// create a new field on the records that don't have it yet 
$collection->update(
    array('country' => 'nz', array('first' => array('$exists' => false))), 
    array('$set' => array('first'=>1)), 
    array('multiple' => true)); 
// ensure index on that field 
$collection->ensureIndex(array('first' => 1)); 
// find everything 
$cursor = $collection->find(); 
// sort on that field 
$cursor->sort(array('first':-1)); 
+0

你好!這隻會按字母順序排列國家。如果我想先將其分類爲具有** nz **的產品,那麼其餘的會隨之而來,它不會僅僅通過關鍵排序工作。 – Bundeeteddee 2012-01-18 03:32:56

+1

我不太清楚我明白你想做什麼。爲什麼你不能只做兩個查詢,如果你想在一個國家的優先次序。或者你可以在NZ上有另一個名爲「countryOrder:0」的鍵/值,然後,在你指定真實的訂單時,你希望國家出現。 – 2012-01-18 03:36:53

+0

兩個查詢將要求我將結果縫合在一起,並且爲了尋呼目的而使用'skip()'和'limit()'失敗。我剛剛編輯了這個問題以獲得更詳細的(?)示例。對不起,我有一段艱難的時間來解釋我想要做的事情。 – Bundeeteddee 2012-01-18 08:16:40

0

簡單的MongoDB排序似乎只能按鍵排序

真正不知情的廢話。

MongoDB可以按多個條件排序。在這裏簡單的看一下基本的 排序文檔會很有用。

http://www.mongodb.org/display/DOCS/Sorting+and+Natural+Order

+0

多鍵是的,沒有價值,但。我知道您可以按{country:1,title:1}之類的內容進行排序,並且會按照該順序進行排序。我正在尋找的是排序像{國家:「au」,標題:1}。在這一點上不可能,但可能在下一個mongo發佈。 [http://blog.mongodb.org/post/16015854270/operations-in-the-new-aggregation-framework] – Bundeeteddee 2012-01-18 08:06:15