在mongodb子数组中排序数据


Sort data in sub array in mongodb

是否可以在mongo数据库中的子数组中排序数据?

{   "_id" : ObjectId("4e3f8c7de7c7914b87d2e0eb"), 
    "list" : [
            {
                "id" : ObjectId("4e3f8d0be62883f70c00031c"),
                "datetime" : 1312787723,
                "comments" : 
                    {
                        "id" : ObjectId("4e3f8d0be62883f70c00031d")
                        "datetime": 1312787723,
                    },
                    {
                        "id" : ObjectId("4e3f8d0be62883f70c00031d")
                        "datetime": 1312787724,
                    },                  
                    {
                        "id" : ObjectId("4e3f8d0be62883f70c00031d")
                        "datetime": 1312787725,
                    },
            }
        ], 
    "user_id" : "3" }

例如,我想按字段"datetime"对评论进行排序。谢谢。或者唯一的变体是选择所有数据并在PHP代码中排序,但我的查询工作与限制从mongo…

使用MongoDB,您可以对文档进行排序或只选择文档的某些部分,但您不能修改搜索查询返回的文档。

如果当前的注释顺序可以改变,那么最好的解决方案是在MongoDB文档中对它们进行排序(find(),然后对于每个文档,对其注释和update()进行排序)。如果你想保持当前注释的内部顺序,那么你必须在每个查询之后对每个文档进行排序。

在这两种情况下,排序都是用PHP完成的。比如:

foreach ($doc['list'] as $list) {
    // uses a lambda function, PHP 5.3 required
    usort($list['comments'], function($a,$b){ return $a["datetime"] < $b["datetime"] ? -1 : 1; });
}

如果您不能使用PHP 5.3,请将lambda函数替换为正常的lambda函数。参见usort()示例