1

我正在使用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")}

我使用这个原始查询来获取$sum每个文档(3 个文档)的所有“monto”的查询。

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

1 回答 1

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);
于 2017-06-24T04:00:07.250 回答