Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

findOne return is not array #79

Closed
Liudon opened this issue Dec 30, 2015 · 5 comments
Closed

findOne return is not array #79

Liudon opened this issue Dec 30, 2015 · 5 comments

Comments

@Liudon
Copy link

Liudon commented Dec 30, 2015

<?php

// This path should point to Composer's autoloader
require_once __DIR__ . "/vendor/autoload.php";

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$collection = new MongoDB\Collection($manager, "db.abc");
$sunnyvale = $collection->findOne(array("id" => 94086));
var_dump($sunnyvale);

?>

output is object.

object(stdClass)#18 (22) {
  ["_id"]=>
  object(MongoDB\BSON\ObjectID)#12 (1) {
    ["oid"]=>
    string(24) "56820bdc10167adb058b4567"
  }
  ["id"]=>
  int(94086)
  ...
}
@Liudon
Copy link
Author

Liudon commented Dec 30, 2015

I found the solution. use the "typeMap" option.

<?php

// This path should point to Composer's autoloader
require_once __DIR__ . "/vendor/autoload.php";

$manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$options = array(
    'typeMap' => array(
        'root' => 'array',
        'document' => 'array',
    ),
);
$collection = new MongoDB\Collection($manager, "db.abc", $options);
$sunnyvale = $collection->findOne(array("id" => 94086));
var_dump($sunnyvale);

?>

@Liudon
Copy link
Author

Liudon commented Dec 30, 2015

the method "find" return is object. and "typeMap" option does not work.

@globules-io
Copy link

findOne has always returned an Object while find returns an array. I believe it has always been like this. Otherwise use find with limit 1 to get an array

@jmikola
Copy link
Member

jmikola commented Jan 2, 2016

As of 1.0.0-beta2, find() and aggregate() also take a typeMap option, which is applied to the returned cursor. Alternatively, you could call setTypeMap() yourself before iterating.

Furthermore, the Client, Database, and Collection objects can also be constructed with a typeMap option, which will be applied by default to relevant operations within each class (as we already do with write concerns and read preferences). The option is also inherited by selected "children" (e.g. the Database returned from Client::selectDatabase() will inherit the Client's options).

As noted in the 1.0.0-beta2 release notes, we intend to have a more user-friendly default type map, so documents and arrays may be returned as ArrayObjects instead of stdClass and array, respectively. This will allow us to ensure we preserve their BSON types when going back to the database (i.e. object data can be cast back to stdClass and arrays can be filtered through array_values() to be numerically reindexed). This is being tracked in #78 and PHPLIB-74.

@jmikola
Copy link
Member

jmikola commented Jan 6, 2016

#78 is merged, so we're now returning ArrayObject instances for BSON document and array types, each of which handle BSON serialization for documents and arrays on the way back into the database. With this change, you can use array access on both types (e.g. $result['field'] or $array[2]) and you should still be able to use property syntax on documents $result->field, provided some BC for people that have now gotten used to working with stdClass instances.

Expect a 1.0.0 release with these new defaults soon.

@jmikola jmikola closed this as completed Jan 6, 2016
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants