2011-08-13 35 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这些用户之间最近的。