laravel-mongodb与嵌套对象的增量

时间:2017-06-05 07:45:50

标签: php mongodb laravel laravel-5 jenssegers-mongodb

我有一个帖子文档,架构看起来像

 class A{
     class B extends AsyncTask<>(){
     }
 }

 class C{
     public void method() {
       //here I want to access class B.
     }
 }

如何通过 { "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", }

更新stats.likes字段

根据GitHub页面,可以使用方法jenssegers/laravel-mongodb。 所以我是这样尝试的

increment()

但得到了

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

但是,使用mongo shell,它可以在代码

中工作
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); } 将直接在方法的第一个参数传递给shell。为什么它可以使用命令行?

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

1 个答案:

答案 0 :(得分:1)

因为我可以通过shell更新嵌套对象,所以我在下面写了一个原始表达式:

$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变量。