MongoDB GridFS获取文件ID
问题描述:
我正在使用MongoDB GridFS存储用户头像。我正在使用Laravel 4.2。MongoDB GridFS获取文件ID
我正在写一个函数来清理任何未使用的头像的数据库; 如果某个头像的id与任何用户(用户模型)都没有关联,则该头像未被使用。鉴于化身的ID,我可以从数据库中删除该文件。但是,我无法提取化身的ID,所以我可以将其与User
模型中的化身进行比较。
的数据是这样的:
$avatars = DB::collection('user_avatars.files')->get();
return Response::json($avatars[0]);
//result:
{"_id":{"$id":"542797096a8d09ac318b456b"},"extension":"jpg","usage":0,"popularity":[],"filename":"image.jpg","uploadDate":{"sec":1411880713,"usec":671000},"length":248388,"chunkSize":262144,"md5":"2c724361015c7e438d30359dd9c724a0"}
现在,如果我写的:
return Response::json($avatars[0]['_id']);
//result is:
{"$id":"542797096a8d09ac318b456b"}
我怎么会抢542797096a8d09ac318b456b
?什么是我迄今试图不给的ID,但将引发一个错误:
$avatars[0]['_id']->$id;
$avatars[0]['_id']['$id'];
$avatars[0]['_id']->$$id;
$avatars[0]['_id']->{$id};
答
我想这和它的伟大工程:
avatars[0]['_id']->{'$id'};
这里完整的功能:
public function doPurgeDB()
{
$removed = array();
$avatars = DB::collection('user_avatars.files')->get();
foreach($avatars as $avatar)
{
$avatar_id = $avatar['_id']->{'$id'}; //<<<<=========
$user = User::where('avatar_id', '=', $avatar_id);
if(!$user->count())
{
$removed[] = $avatar;
$this->removeAvatar($avatar_id);
}
}
return Response::json($removed);
}
public function removeAvatar($id)
{
$grid = DB::getGridFS('user_avatars');
return $grid->delete(new MongoId($id));
}
虽然[一行答案](http://meta.stackoverflow.com/questions/266954/one-line-answers)是可以接受的,但它们通常会导致答案被路由到Review Queue(* q.v. *)。另外,有时他们不被社区所接受。通常提供一个简单的解释是一个好主意。 – jww 2014-10-02 00:40:18
你是对的。然而,有些问题非常具体,以致需要“单线答案”。为这些问题提供更多的线路将会产生反作用。如果我对这个答案的工作原理有了一些解释,我会把它包括进来......实际上我会自己去找出它,因为它可能无疑会帮助其他人,但我很高兴我有一个解决方案,我可以继续在我的项目上工作。 – PeterKA 2014-10-02 01:36:29