1

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

    {
        "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通过更新字段jenssegers/laravel-mongodb

根据GitHub页面,有一种方法increment()可以使用。所以我正在尝试这种方式

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

但是得到了

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

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

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将直接在方法的第一个参数处传递给 shell。为什么它只能与命令行一起使用?

  • MongoDB 3.4
  • jenssegers/laravel-mongodb 3.2
  • 拉拉维尔 5.4
4

1 回答 1

2

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

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

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

});

请注意,您可能具有 with 的效果db.articles.update(),但Mongo\Collection没有名为update()、 usefindOneAndUpdate或其他方法的方法。( UpdateMany, UpdateOne)

如果 where 条件包含,则在原始表达式的情况下_id,您必须用 object 包装您的 id 变量。\MongoDB\BSON\ObjectID

于 2017-06-07T09:02:56.767 回答