Обновите все документы для добавления хэша sha1 существующих полей - PullRequest
0 голосов
/ 18 мая 2019

Мне нужно добавить поле ко всем документам, имеющим объединенную коллекцию sha1, уже существующую в документе

У меня есть php-скрипт, выполняющий миграцию и извлекающий отдельные записи. затем легко хэшировать «взорванные» значения, а затем sha1 сохранять обратно в БД.

Проблема в том, что для большого набора данных это навсегда. В идеале один запрос «updateMany», который может быть передан mongo, а остальная часть обрабатывается, будет безопаснее / эффективнее / быстрее.

do {
            $itemIDs = DB::collection('items')
                ->where('deleted_at', 'exists', false)
                ->where('item_hash', null)
                ->limit(10000)
                ->get(["_id"]);

            $ids = [];
            foreach ($itemIDs as $itemID) {
                $ids[] = $itemID['_id'];
            }

            $recordCount = count($itemIDs);

            $itemChunks = array_chunk($ids, 100);
            foreach ($itemChunks as $key => $itemChunk) {
                $prods = Item::whereIn("_id", $itemChunk)->get();
                foreach ($items as $item) {
                    $hash = sha1(implode("",$item->relationships['options']));
                    $item->item_hash = $hash;
                    $item->save();
                }
            }
        } while ($recordCount > 0) ;

Я хотел бы выполнить запрос, который может сделать что-то вроде намерения этого:

db.collection('items').updateMany(
  {'deleted_at': {'$exists': false},'item_hash':null}
  {'$set': {'item_hash': sha1($this.options.join('')}}
);
...