代码之家  ›  专栏  ›  技术社区  ›  Yusuf Damista

将mongodb节点代码转换为php

  •  0
  • Yusuf Damista  · 技术社区  · 6 月前

    我的节点代码可以工作,但当我想用PHP编写它时,它不起作用。你能帮忙吗?

    节点代码mongo-sh工作没有任何问题

      db.mevcutlot.aggregate([{$match: {_id: {$ne: null}}}, 
        { $sort: { ederi: -1 } },
        { $group: { _id: '$firmasaf', data: { $push: '$$ROOT' } } },
        { $project: { _id: 0, data: { $arrayElemAt: ["$data", 0] } } },
        { $replaceRoot: { newRoot: "$data" } }])
    

    PHP代码

    $pipeline=array(
        array(
            '$match' => array(
                '_id' => ['$ne'=>NULL],
             )
        ),
        array(
            '$sort' => array(
                 'ederi'=>  -1,
             )
        ),
        array(
            '$group' => array(
                 '_id' => '$firmasaf', 'data'=> ['$push'=> '$$ROOT'],            
             )
        ),
        
        array(
            '$project' => array(
            '_id' => 0, 
            'data' => ['$arrayElemAt'=> ["$data", 0]],
             )
        ),
         array(
            '$replaceRoot' => array(
                 'newRoot'=> "$data",        
             )
        ),
        
    ); 
        $mana = $mevcutlot->aggregate($pipeline)->toArray();
        print_r($mana);
    

    我无法返回任何结果

    2 回复  |  直到 6 月前
        1
  •  1
  •   Wernfried Domscheit    6 月前

    首先,我建议优化你的管道:

    db.mevcutlot.aggregate([
        { $match: {_id: {$ne: null}}}, 
        { $sort: { ederi: -1 } },
        { $group: { _id: '$firmasaf', data: { $push: '$$ROOT' } } },
        { $project: { _id: 0, data: { $arrayElemAt: ["$data", 0] } } },
        { $replaceRoot: { newRoot: "$data" } }
    ])
    

    { $match: {_id: {$ne: null}}} 没有任何意义,因为 _id 始终存在且从不为空。跳过此阶段。

    而不是

    { $sort: { ederi: -1 } },
    { $group: { _id: '$firmasaf', data: { $push: '$$ROOT' } } },
    { $project: { _id: 0, data: { $arrayElemAt: ["$data", 0] } } },
    

    你可以使用

    { $sort: { ederi: -1 } },
    { $group: { _id: '$firmasaf', data: { $first: '$$ROOT' } } },
    

    甚至更短:

    { $group: { _id: '$firmasaf', data: { $top: { output: '$$ROOT', sortBy: { ederi: -1 } } } } },
    

    它应该比您的查询执行得更好。

    现在,关于您的问题:当您使用双引号字符串时,变量将被值替换,请参阅 String interpolation

    因为 $data 变量很可能为空, '$arrayElemAt'=> ["$data", 0] 被替换为 '$arrayElemAt'=> ["", 0] 'newRoot'=> "$data" 成为 'newRoot'=> "" 。你应该得到一个警告” 警告:未定义的变量$data。。。 "

    在所有地方使用单引号或转义 $ 例如。 "\$data" .

        2
  •  0
  •   Yusuf Damista    6 月前

    谢谢你,我的朋友,问题出在双引号里。

    array(
            '$project' => array(
            '_id' => 0, 
            'data' => ['$arrayElemAt'=> ['$data', 0]],
             )
        ),
         array(
            '$replaceRoot' => array(
                 'newRoot'=> '$data',        
             )
        ),
    

    这样做可以修复它