【问题标题】:How to sort an inner array in a document?如何对文档中的内部数组进行排序?
【发布时间】:2019-09-12 16:32:14
【问题描述】:

我正在通过 $push 在我的文档中的一个数组中进行“插入”,其中有一个字段日期,我想在使用 find() 时对其进行排序,但不对“_id”进行排序。如何按日期排序 (ordens.dtOrdem)?

    <?php
        $mongo = (new MongoDB\Client('mongodb://localhost:27017'))->Carteira;
        $collection = $mongo->ativo;

        /*First way that I've tried*/
        $result1 = $collection->find([].['ordens' => ['sort' => ['dtOrdem' => -1]]]);

   /*Second way that I've tried*/
   $result2 = $collection->find([],['ordens' => ['each' => ['ordens' => ['sort' => ['dtOrdem' = -1]]]]]);
?>

字段“ordens.dtOrdem”没有降序排序。

【问题讨论】:

    标签: php arrays mongodb sorting


    【解决方案1】:

    您无法在find() 期间对数组进行排序。你有两个选择:

    1. 您可以在$push 期间指定$sort 操作,以确保您的元素按排序顺序添加到数组中。
    2. 您可以在检索时使用聚合对数组进行排序。

    解决方案可能类似于以下内容(可能需要进行一些修改):

    // Sorting on push.
    $collection->updateOne(
        [...],
        [ '$push' => [
            'ordens' => [
                // You MUST include the $each operator here or this will not work.
                '$each' => [
                    [ 'dtOrdem' => 5 ]
                ],
    
                // Where the magic happens, sorts in descending order.
                '$sort'=> [ 'dtOrdem' => -1 ]
            ]
        ]]
    );
    
    // Sorting on retrieval.
    $collection->aggregate([
        [ '$unwind' => '$ordens' ],
        [ '$sort' => [
            '$ordens.dtOrdem' => -1
        ]],
        [ '$group' => [
            '_id' => '$_id',
            'ordens' => [
                '$push' => '$ordens'
            ]
        ]]
    ]);
    

    【讨论】:

    • 非常感谢!你帮了我很多。我需要编辑一下,你确实帮了我!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 2015-09-11
    • 1970-01-01
    相关资源
    最近更新 更多