Remember: идентификатор документа MongoDB (поле
_id
) не является скаляром, но представляет собой экземпляр класса \MongoDB\BSON\ObjectID. Чтобы получить фактическую строку Mongo ID, вы должны привести тип экземпляра \MongoDB\BSON\ObjectID к строке:
$query = new Query();
$row = $query->from('customer')->one();
var_dump($row['_id']); // вывод: "object(\MongoDB\BSON\ObjectID)"
var_dump((string) $row['_id']); // вывод: "string 'acdfgdacdhcbdafa'"
Хотя это обстоятельство, иногда, весьма полезно, но часто приводит к некоторым проблемам.
Вы можете столкнуться с ними составляя URL или при попытке сохранения _id
в другое хранилище.
В этих случаях убедитесь, что вы конвертировали \MongoDB\BSON\ObjectID в строку:
/* @var $this yii\web\View */
echo $this->createUrl(['item/update', 'id' => (string) $row['_id']]);
То же самое относится и к реализации идентификационных данных пользователя, которые хранятся в MongoDB. При реализации \yii\web\IdentityInterface::getId() вы должны привести \MongoDB\BSON\ObjectID класс к скаляру чтобы аутентификация начала работать.
При задании условия, значения для ключа _id
будет автоматически приведено к \MongoDB\BSON\ObjectID
например, даже если они простые строки. Так что нет необходимости выполнять обратное приведение _id
к строке:
use yii\web\Controller;
use yii\mongodb\Query;
class ItemController extends Controller
{
/**
* @param string $id MongoId строка (не является объектом)
*/
public function actionUpdate($id)
{
$query = new Query;
$row = $query->from('item')
->where(['_id' => $id]) // неявное приведение типа [[\MongoDB\BSON\ObjectID]]
->one();
...
}
}
Тем не менее, если у вас есть другие столбцы, содержащие \MongoDB\BSON\ObjectID, вы должны позаботиться о возможном приведении типов на свое усмотрение.