2011-08-13 94 views
2

我在MongoDB的結構如下(是一個例子結構):排序MongoDB的結果

Array 
(
    [_id] => MongoId Object 
     (
      [$id] => 4e465de048177e8105000003 
     ) 

    [id_usuario] => MongoId Object 
     (
      [$id] => 4e43b20648177e5305000000 
     ) 

    [mensaje] => lero lero si? 
    [created_at] => MongoDate Object 
     (
      [sec] => 1313234400 
      [usec] => 160000 
     ) 
    [comentarios] => Array 
     (
      [0] => Array 
      (
       [comentario] => hola mundo 
       [usuario] => [_id] => MongoId Object 
        (
         [$id] => 4e465de048177e8105000003 
        ) 
       [created_at] => MongoDate Object 
       (
        [sec] => 1313234400 
        [usec] => 160000 
       ) 
      ) 
      [1] => Array 
      (
       [comentario] => hola mundo 
       [usuario] => [_id] => MongoId Object 
        (
         [$id] => 4e465de048177e8105000003 
        ) 
       [created_at] => MongoDate Object 
       (
        [sec] => 1313234400 
        [usec] => 160000 
       ) 
      ) 
     ) 
) 

我想通過created_at排序最後的10條評論中下降,我寫了以下內容:

$db->usuarios->find()->sort(array('created_at' => -1))->limit(10)->skip(0); 

(這是PHP代碼驅動的MongoDB)

誰能幫我做相同的,但也顯示最近3條評論通過created_at降序排列?

在單個查詢中可能嗎?你能幫忙嗎?

+0

這是合乎邏輯的:按升序排序並獲取前三個(相當於後三個以降序排列)。 – netcoder

+0

¿?我的意思是,如果你能得到最後3條評論,最初被諮詢的10條評論和所有這一切都可以一次性完成。那可能嗎? - 喲我反駁了一個問題嗎?3個問題可以解決嗎?10個問題可以解決嗎?請問您可以提供哪些諮詢服務? – JALF

+0

請用英文發佈。 [堆棧溢出僅用於英文](http://meta.stackexchange.com/questions/13676/is-english-required-on-stack-overflow)。 – netcoder

回答

1

我不知道php足夠了解你描述的文檔結構。所以我假定comment文件「嵌入」在您的usuario文件中。

如果這是真的,那麼你不能直接尋址comment文件。您將首先獲取usuario文檔。因此,您將獲得一組comment文檔,您必須在客戶端進行排序和過濾。

或者,如果您的評論對象以特定順序存儲,則可以使用$ slice獲取前3個或前10個或任何此類子集。更多信息:http://www.mongodb.org/display/DOCS/Retrieving+a+Subset+of+Fields#RetrievingaSubsetofFields-RetrievingaSubrangeofArrayElements

1

我想通過created_at排序最後的10條評論中下降,我寫了以下內容:

$db->usuarios->find()->sort(array('created_at' => -1))->limit(10)->skip(0); 

該查詢返回的最後10個usarios(用戶)和所有的意見:

要獲得最新的3條評論,您必須先按'commentarios.created_at'排序,然後過濾這些結果。就像這樣:

$user = $db->usuarios->find()->sort(array('commentarios.created_at' => -1)->limit(3); 
$comments = array_merge($user[0]['commentarios'], $user[1]['commentarios'], $user[2]['commentarios'] 
$ordered = uasort($comments, 'sorter') 

function sorter($a, $b) { 
    return $a['created_date'] < $b['created_date']; 
} 

注意,發現收益3個用戶他們的意見,所以你必須找到3這些用戶之間最近的。