YarkoDzech
@YarkoDzech
будучи трезвым, сдержи все свои пьяные обещания!

Как заставить Backbone понимать id mongodb?

Как заставить Backbone работать с _id MongoDB?

Пока вижу два варианта:
1. Инкрементить id в процесе создания документа, но из-за доступа к базе большого количества людей, этот инкримент нужно держать отдельно, или вообще в Redis'e. Это боль и ненужный велосипед.
2. Новый драйвер mongo выкидывает кучу методов, в том числе после insertOne дает ->getInsertedId(). Как вариант, можно после создания документа тут же находить его и пихать в насильно созданное поле id распарсеный _id монги, но это тоже боль и дополнительный запрос-апдейт.

Может кто разобрал вариант с idAttribute: "_id" особенно при put апдейтах и delete дестроях?
  • Вопрос задан
  • 296 просмотров
Решения вопроса 1
YarkoDzech
@YarkoDzech Автор вопроса
будучи трезвым, сдержи все свои пьяные обещания!
Значит так.
Согласно мыслей, которые описали товарищи выше.

Исходя из условий что backEnd у нас принимающая сторона для изменений в базе и не более, то:

Backbone GET
через find() получаем стек документов, дальше через foreach пакуем каждый документ ($example) (или определенные поля) в json попутно закинув туда id которое равно $example['_id']->__toString()

Backbone POST
при создании документа есть метод получения его _id:
$example = $someCollection->insertOne(/../);
$idExample = $example->getInsertedId();
Запаковываем полученный только что $idExample в прилетевший нам json, тем же методом:
$idExample->__toString()
и отправляем json обратно на сторону backBone

Backbone PUT и DELETE
На сторону backEnd прилетает id в виде строки, перепаковываем строку в ObjectID
$input = json_decode(file_get_contents('php://input'));
$objId = new MongoDB\BSON\ObjectID($input->id);
*штатного метода не нашел

И уже по этому $objId апдейтим или удаляем документ

В принципе.. для связки костыль с нескольких строк, без дополнительных бубнов с инкрементами или дополнительными запрос-апдейт.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@lega
insertOne дает ->getInsertedId().
Вместо этого нужно создавать новый ObjectID(), и указывать его при сохранении в БД. В этом случае у вас будет финальный _id на руках до сохранения.
Незнаю что там с Backbone, но на клиент я передавал и ObjectId и DBRef как есть, и на клиенте их использовал.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы