【问题标题】:$match Array in a raw MongoDB Laravel Query原始 MongoDB Laravel 查询中的 $match 数组
【发布时间】:2017-06-24 03:50:13
【问题描述】:

我正在使用 jenssegers 驱动程序在 laravel 中使用 mongodb,我的数据库中有 3 个类似这样的文档

{ 
"_id" : ObjectId("594dd540bb7de924c0005583"), 
"cliente" : "Luis", 
"tipo" : "Luis", 
"paquete" : "Luis", 
"fecha" : null, 
"fechaE" : null, 
"content" : "fotos", 
"precio" : NumberInt(200), 
"estatus" : NumberInt(2), 
"Abonos" : [
    {
        "Monto" : NumberInt(200), 
        "Fecha" : null
    }, 
    {
        "Monto" : NumberInt(2000), 
        "Fecha" : null
    }, 
    {
        "Monto" : NumberInt(2000), 
        "Fecha" : null
    }
], 
"updated_at" : ISODate("2017-06-24T02:58:08.000+0000"), 
"created_at" : ISODate("2017-06-24T02:58:08.000+0000")}

我正在使用这个 Raw 查询来获取每个文档(3 个文档)的所有“monto”的 que $sum

  public function updatearray(Request $request, $id){
        $works = new work;
      $result = Work::raw(function($collection)
  {
     return $collection->aggregate(array(
            array('$unwind' => '$Abonos'),
            array('$group' =>
            array( "_id" => '$_id',"Monto" => array('$sum' => '$Abonos.Monto'))),
          ));
 });}

我只想显示我当前文档的结果,有没有办法可以匹配当前的$id

-- 编辑 我从 get 方法获取 id

  public function abono($id){
  $work = work::find($id);
  return view('workabono', compact('work'));
}

这些是我使用的路线

Route::get('works/{work}/abono', [
'as' => 'works.abono', 'uses' => 'WorkController@abono']);
Route::put('works/{work}/', [
'as' => 'works.updateAbono', 'uses' => 'WorkController@updatearray']);

【问题讨论】:

    标签: php mongodb laravel aggregation-framework jenssegers-mongodb


    【解决方案1】:

    您甚至不需要$unwind。只需$match$project

     public function updatearray(Request $request, $id){
            $works = new work;
          $result = Work::raw(function($collection) use($id)
      {
         return $collection->aggregate(array(
                array('$match' => array( '_id' => $id) ),
                array('$project' =>
                  array( "Monto" => array('$sum' => '$Abonos.Monto') )
                )
              ));
     });}
    

    $sum 可以直接从数组中添加元素。

    如果$id 是一个字符串,您可以显式转换为ObjectId

    $id = new \MongoDB\BSON\ObjectID($id);
    

    【讨论】:

    • @LuisPreciado 这里的 BSON 库与应用程序命名空间是分开的。您是否尝试过按原样提供 $id 值?根据你从哪里得到它,它可能已经被转换为正确的类型。您从哪里读取该值?
    • @LuisPreciado 我的错。忘记了全局命名空间的前导斜杠 \
    • 我正在从我的控制器中的这个函数中获取 id ` public function abono($id){ $work = work::find($id);返回视图('workabono',紧凑('工作')); }` 我试图提供它,但我得到了这个 object(Illuminate\Database\Eloquent\Collection)#201 (1) { ["items":protected]=> array(0) { } }
    • @LuisPreciado 请在您的问题中包含您从中检索$id 值的代码。听起来您甚至不需要强制转换,但我需要查看代码的上下文以确定。
    • 我仍然得到 未定义的变量:id 我的代码 link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2012-10-29
    • 1970-01-01
    • 2021-10-29
    • 2020-03-21
    • 2017-11-25
    • 1970-01-01
    相关资源
    最近更新 更多