Мне нужно добавить поле ко всем документам, имеющим объединенную коллекцию 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('')}}
);