简体   繁体   中英

How to get collection class object from mongodb/driver/manager in PHP

I am using the (current? not sure, php documentation is very opaque to me) method to connect to a MongoDB from PHP:

$manager = new MongoDB\Driver\Manager("mongodb://{$user}:{$pwd}@{$url}", array("ssl" => true), array("context" => $ctx));

From there, if I want to write something I do the following:

$bson = MongoDB\BSON\fromJSON($newData);
$value = MongoDB\BSON\toPHP($bson);
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->update(
    $filter,
    ['$set' => $value],
    ['multi' => false, 'upsert' => $upsert]
);

$results = $manager->executeBulkWrite("$DB.$collection", $bulk);

var_dump($results);

All the documentation on the MongoDB PHP tutorials starts with a $collection object... and the functions thereafter seem much more user-friendly (getInsertedID... insertOne...find...findOne...etc).

For example:

<?php

$collection = (new MongoDB\Client)->test->users;

$insertManyResult = $collection->insertMany([
    [
        'username' => 'admin',
        'email' => 'admin@example.com',
        'name' => 'Admin User',
    ],
    [
        'username' => 'test',
        'email' => 'test@example.com',
        'name' => 'Test User',
    ],
]);

printf("Inserted %d document(s)\n", $insertManyResult->getInsertedCount());

var_dump($insertManyResult->getInsertedIds());

It is not clear to me, how they are actually connecting to the DB... how would I go from the $manager connection to a $collection ?

On the MongoDB PHP documentation page, it says 'You can construct collections directly using the driver's MongoDB\Driver\Manager class'. Unfortunately, a search on the resulting page doesn't include the word 'collection' other than as a side comment in a user contributed note'

Elsewhere on the MongoDB PHP reference pages, I see nowhere that the MongoDB\Manager class is described.

So, how do I get access to the many features in the MongoDB\Collection class ?

I was not able to get a collection out of the Manager class, however, I was able to use the bulkWrite class to execute an insert in a secure fashion (I believe). I expect the same pattern will work for reads and updates as well.

Code snippet for those that come here after me:

//echo "Specify the cert...";
$SSL_DIR = ".";
$SSL_FILE = "XXXXXX.pem";
$ctx = stream_context_create(array(
    "ssl" => array(
        "cafile" => $SSL_DIR . "/" . $SSL_FILE,
    ))
);
//echo "Done\n";
// echo "Creating manager...";
$manager = new MongoDB\Driver\Manager("mongodb://{$user}:{$pwd}@{$url}", array("ssl" => true), array("context" => $ctx));
// echo "Done!\n";

// echo "Making BSON...";
$bson = MongoDB\BSON\fromJSON($newData);
// echo "Done!\nMaking Value...";
$value = MongoDB\BSON\toPHP($bson);
$value->_id = (string) new MongoDB\BSON\ObjectID;

// echo "Done!\nMaking Bulk...";
$bulk = new MongoDB\Driver\BulkWrite;
$bulk->insert($value);

// echo "Done!\nExecuting Bulk Write";
$results = $manager->executeBulkWrite("$db.$collection", $bulk);

if($results->getInsertedCount()==1) {
    echo $value->_id;
} else {
    echo $results->getWriteErrors();
}
// echo "Done!\n";

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM