我尝试过多种方式从updateOne
,findOneAndUpdate
到insert
,甚至试过bulkWrite
但没有成功。
我所做的是我有两个集合,即users集合和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));
答案 0 :(得分:1)
对于需要数组类型的$push
运算符,没有解决方法。不幸的是,这需要在users
集合中迁移文档。在以下主题中讨论了这样做的一些方法:
或者,如果您不想一次迁移users
中的所有文档,则可以让代码按顺序执行两个findOneAndUpdate()
操作。第一个操作可以使用$type
仅将文档与{ "personal.profile_id": { $type: "string" }}
匹配,然后使用$set
分配最新的图像ID。然后,第二个操作可以将文档与array type匹配,并使用$push
策略(请注意$type
不能用于检测数组字段)。然后调用代码将期望这些操作中的一个实际上找到并更新文档(如果不是这样,则考虑记录错误)。然后,此方法将允许您开始收集已迁移文档的旧图像ID,但继续覆盖未迁移文档的字段。
根据您提供的代码进行的另一项观察:
['$push' =>["personal.profile_id"=>['$oid'=>New MongoDB\BSON\ObjectId($ids)]]]
$oid
看起来像是ObjectID的extended JSON语法。这既不是更新操作符,也不是在BSON文档中使用的有效密钥。尝试通过mongo shell执行此更新会产生以下服务器端错误:
美元($)前缀字段' $ oid' ' personal.profile_id .. $ OID'对于存储无效。"
如果您只想将ObjectID推送到数组上,则以下内容应该足够了:
['$push' => ['personal.profile_id' => new MongoDB\BSON\ObjectId($ids)]]