laravel-mongodb 随嵌套对象递增
laravel-mongodb increment with nested object
我有一个 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
但是,使用 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。为什么它只能与命令行一起使用?
- MongoDB3.4
- jenssegers/laravel-mongodb 3.2
- Laravel 5.4
因为我可以通过 artisan 命令更新嵌套对象,所以我在下面写了一个原始表达式:
$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
或其他方法。 (UpdateMany
, UpdateOne
)
如果 where 条件包含 _id
,在原始表达式的情况下,您必须用 \MongoDB\BSON\ObjectID
对象包装您的 id 变量。
我有一个 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
但是,使用 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。为什么它只能与命令行一起使用?
- MongoDB3.4
- jenssegers/laravel-mongodb 3.2
- Laravel 5.4
因为我可以通过 artisan 命令更新嵌套对象,所以我在下面写了一个原始表达式:
$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
或其他方法。 (UpdateMany
, UpdateOne
)
如果 where 条件包含 _id
,在原始表达式的情况下,您必须用 \MongoDB\BSON\ObjectID
对象包装您的 id 变量。