2017-06-05 316 views
0

laravel-MongoDB的增量我有一個post文檔的架構看起來像嵌套對象

{ 
     "author": { 
      "name": "John", 
      "gender": 0 
     }, 
     "stats": { 
      "likes": 0 
     }, 
     "content": "The new post", 
     "updated_at": "2017-06-05 15:15:21", 
     "created_at": "2017-06-04 18:10:30", 
    } 

我怎樣才能通過jenssegers/laravel-mongodb

更新stats.likes場據GitHub的頁面,有一個方法increment()可以使用。 所以我想這樣

Post::findOrFail($request->id)->increment('stats.likes'); 

,但得到

ErrorException in HasAttributes.php line 906: 
Undefined index: stats.likes 

然而,蒙戈外殼,它可以在代碼

db.posts.update({ '_id': ObjectId('5933dc7d4abcf141956a6250') }, { '$inc': { 'stats.likes': 1 }) ) 

工作,通過嵌套導致錯誤目的?

根據源代碼,我發現

/** 
* @inheritdoc 
*/ 
public function increment($column, $amount = 1, array $extra = [], array $options = []) 
{ 
    $query = ['$inc' => [$column => $amount]]; 

    if (! empty($extra)) { 
     $query['$set'] = $extra; 
    } 

    // Protect 
    $this->where(function ($query) use ($column) { 
     $query->where($column, 'exists', false); 

     $query->orWhereNotNull($column); 
    }); 

    return $this->performUpdate($query, $options); 
} 

如果我沒有錯,字段名stats.likes將傳遞到外殼直接在方法的第一個參數。爲什麼只能使用命令行?

  • MongoDB的3.4
  • jenssegers/laravel-mongodb的3.2
  • Laravel 5.4

回答

0

由於我可以更新通過殼嵌套對象,我寫下面備選地原始表達式:

$result = Post::raw(function($collection) use ($request){ 

    return $collection->findOneAndUpdate([ 
     '_id' => new \MongoDB\BSON\ObjectID ($request->_id), 
    ], [ '$inc' => [ 'stats.likes' => 1 ] ]); 

}); 

請注意,您可能對db.articles.update()有影響,但Mongo\Collection沒有名爲update()的方法,請使用findOneAndUpdate或其他方法。 (UpdateManyUpdateOne

如果WHERE條件包含_id,你必須在原表達的情況下\MongoDB\BSON\ObjectID對象來包裝你的id變量。