原始MongoDB Laravel查询中的$ match数组

时间:2017-06-24 03:50:14

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

我使用jenssegers驱动程序在laravel中使用mongodb,我在db中有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查询来获取所有" monto"的que $sum每份文件(3份文件)。

  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']);

1 个答案:

答案 0 :(得分:0)

你甚至不需要$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);