Вариант № 1: Применение сторона обновление
Самый простой подход при использовании Doctrine ODM - выполнить обновление со стороны приложения. Таким образом, вы получаете все объекты, которые хотите обновить, внесите необходимые корректировки и промойте их.
$services = $dm->createQueryBuilder('MyBundle:MyService')
->getQuery()
->execute();
foreach ($services as $service) {
$service->setUpdatedAt($service->getCreatedAt());
}
$db->flush();
$services
представляет Монго курсор, который будет получать документы, как вы итерацию. Вы можете установить eagerCursor
на номер true
, если вы хотите получить все документы из коллекции сразу.
Вариант № 2: База данных сторона обновление
Вы также можете выполнить обновление непосредственно на самой базе данных. Однако для этого вам нужно создать запрос самостоятельно, так как построитель запросов не поддерживает эту функцию.
// Get MongoDB instance from DocumentManager
$mongo = $dm->getDocumentDatabase('Fully/Qualified/Class/Name')
->getMongoDB();
// Iterate over the collection and update each document
$mongo->execute('
db.MyServiceCollection.find().forEach(function (item) {
db.MyServiceCollection.update(
{_id: item._id},
{$set: {updated_at: item.created_at}}
);
});
');
Функция используется в forEach
просто обычный Javascript функция, так что вы можете вставить больше логики там, если вам нужно больше контроля над тем, что вы обновляете.
Возможно с агрегатом ?? – Fran