2017-06-05 268 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变量。