【问题标题】:MongoDB $push ObjectIdMongoDB $推送对象ID
【发布时间】:2017-07-07 18:25:22
【问题描述】:

我尝试了多种方法,从updateOnefindOneAndUpdateinsert,甚至尝试过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


【解决方案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 看起来像 extended JSON 的 ObjectID 语法。这既不是更新运算符,也不是在 BSON 文档中使用的有效密钥。尝试通过 mongo shell 执行此更新会产生以下服务器端错误:

美元 ($) 前缀字段 '$oid' 'personal.profile_id..$oid' 对存储无效。"

如果您只想将 ObjectID 推送到数组中,则以下内容就足够了:

['$push' => ['personal.profile_id' => new MongoDB\BSON\ObjectId($ids)]]

【讨论】:

    猜你喜欢
    • 2019-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-26
    • 2016-03-05
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多