【发布时间】:2017-07-07 18:25:22
【问题描述】:
我尝试了多种方法,从updateOne、findOneAndUpdate 到insert,甚至尝试过bulkWrite,但均未成功。
我所做的是我有两个集合,用户集合和 image_upload 集合。我将用户个人资料图片与用户上传的所有其他图片一起存储在 image_upload 中。
然后我存储在 users 集合中的是 image_upload 集合的 ObjectID,该集合与用户在创建帐户时上传的图片相匹配(他们可以随时通过编辑个人资料上传新的个人资料图片)。
所以我想要的是能够在获得时更新 ObjectId。
personal.profile_id 字段必须是一个数组,但在文档中是 objectId 类型。这是代码。理想情况下,我希望它具有 ObjectID 而不仅仅是字符串。
$db = static::db()->image_upload;
try {
$newdata = [
"data"=>
[
"url" => $publlic_url,
"type"=> $mimetype,
"date"=>new MongoDB\BSON\UTCDateTime(),
"profile_pic" => true
],
"uid"=>New MongoDB\BSON\ObjectId($uid)
];
$oauth_update = $db->insertOne($newdata);
$view['newdata'] = $newdata;
} catch(MongoResultException $e) {
return $response->withStatus(200)
->withHeader('Content-Type', 'application/json')
->write($e->getDocument());
}
$ids = $oauth_update->getInsertedId();
$latest = $db->findOne(array("uid"=>New MongoDB\BSON\ObjectId($uid)));
// Check first, last and other personal details.
$db = static::db()->users;
try {
$newdata = ['$set' =>["personal.profile_id"=>New MongoDB\BSON\ObjectId($ids)]];
$member_profile = $db->findOneAndUpdate(
['kst'=>New MongoDB\BSON\ObjectId($uid)],
['$push' =>["personal.profile_id"=>['$oid'=>New MongoDB\BSON\ObjectId($ids)]]],
[
'projection' =>
[ 'personal' => 1 ],
"returnDocument" => MongoDB\Operation\FindOneAndUpdate::RETURN_DOCUMENT_AFTER
]);
} catch(MongoResultException $e) {
echo $e->getCode(), " : ", $e->getMessage(), "\n";
var_dump($e->getDocument());
return $response->withStatus(200)
->withHeader('Content-Type', 'application/json')
->write(array('code'=>$e->getCode(), 'message'=>$e->getMessage));
}
return $response->withStatus(200)
->withHeader('Content-Type', 'application/json')
->write(json_encode($member_profile));
【问题讨论】:
-
有点不清楚你在这里实际问的是什么。但我看到它的方式是
$ids = $oauth_update->getInsertedId()实际上应该返回一个ObjectId,因此不需要再次尝试“转换”该值。所以你应该改为['$push' =>["personal.profile_id"=> $ids]]。此外,“复数”命名在它应该只是一个奇异值时也不是很清楚。对于“推送数组”,如果这是意图,您将使用$each修饰符。
标签: mongodb mongodb-php