Здесь я создал коллекцию с одним документом
db.getCollection('example').insert({"example":1});
Я попытался использовать Projection, и я возвращаю _id.
db.getCollection('example').find({"example":1},{"_id":1}); { "_id" : ObjectId("562a6300bbc948a4315f3abc") }
Тем не менее, мне нужен приведенный ниже результат, как показано ниже.
ObjectId ("562a6300bbc948a4315f3abc") против "562a6300bbc948a4315f3abc"
{ "id" : "562a6300bbc948a4315f3abc" }
Хотя я могу обрабатывать # 1 и # 2 на моем сервере приложений (на основе PHP), чтобы получить желаемый вывод, я смотрю, есть ли способ получить ожидаемый результат при запросе от самого монго
Вам нужно использовать метод .aggregate()
.
db.getCollection('example').aggregate([ { "$project": { "_id": 0, "id": "$_id" } } ]);
Который дает:
{ "id" : ObjectId("562a67745488a8d831ce2e35") }
или используя свойство .str
.
db.getCollection('example').find({"example":1},{"_id":1}).map(function(doc) { return {'id': doc._id.str } })
Что возвращает:
[ { "id" : "562a67745488a8d831ce2e35" } ]
Хорошо, если вы используете драйвер PHP, вы можете сделать что-то вроде этого:
$connection = new MongoClient(); $db = $connection->test; $col = $db->example; $cursor = $col->find([], ["_id" => 1]); foreach($cursor as $doc) { print_r(array("id" => $doc["_id"])); }
Который дает:
Array ( [id] => MongoId Object ( [$id] => 562a6c60f850734c0c8b4567 ) )
Или снова используйте метод MongoCollection::aggregate
.
$result = $col->aggregate(array(["$project" => ["id" => "$_id", "_id" => 0]]))
Затем, используя цикл foreach
:
Array ( [_id] => MongoId Object ( [$id] => 562a6c60f850734c0c8b4567 ) )
Одним из простых решений для перемещения MongoCursor на стороне PHP является использование генераторов, а также foreach
или array_map($function, iterator_to_array($cursor))
. Пример:
function map_traversable(callable $mapper, \Traversable $iterator) { foreach($iterator as $val) { yield $mapper($val); } }
Вы можете больше узнать о документации по синтаксису генераторов PHP .
Таким образом, теперь вы можете использовать / повторно использовать его (или аналогичную реализацию) для любого предложения «спроектировать» ваши данные на стороне PHP с любым количеством сопоставлений (как и в случае с конвейером в aggregate
), но с меньшим количеством итераций. И это решение довольно удобно для ООП в случае повторного использования ваших функций map
.
UPD: как раз для вашего примера ниже:
$cursor = $db->getCollection('example')->find(["example":1],["_id":1]); $mapper = function($record) { return array('id' => (string) $record['_id']); //see \MongoId::__toString() } $traversableWithIdAsStringApplied = map_traversable($mapper, $cursor); //...
теперь вы можете продолжить с большим количеством сопоставлений, применяемых к $ traversableWithIdAsStringApplied, или использовать только iterator_to_array для простого извлечения массива.