Я написал этот маленький скрипт, который использует пакетные записи (макс. 500) и записывает только одну партию за другой.
использовать его, сначала создавая batchWorker let batch: any = new FbBatchWorker(db);
Затем добавьте что-нибудь к рабочему batch.set(ref.doc(docId), MyObject);
. И закончите его через batch.commit()
. Api такой же, как для обычной Firestore Batch ( https://firebase.google.com/docs/firestore/manage-data/transactions#batched-writes ) Однако в настоящее время он поддерживает только set
.
import {firestore} from "firebase-admin";
export default class FbBatchWorker {
db: firestore.Firestore;
batchList: FirebaseFirestore.WriteBatch[] = [];
elemCount: number = 0;
constructor(db: firestore.Firestore) {
this.db = db;
this.batchList.push(this.db.batch());
}
async commit(): Promise {
let batchProms: Promise[] = [];
for (let _batch of this.batchList) {
(await _batch.commit());
console.log("finished writing batch");
// batchProms.push(_batch.commit());
}
// return Promise.all(batchProms);
return Promise.resolve("yeah");
}
set(dbref: FirebaseFirestore.DocumentReference, data: any): void {
this.elemCount = this.elemCount + 1;
if (this.elemCount % 490 === 0) {
this.batchList.push(this.db.batch());
}
this.batchList[this.batchList.length - 1].set(dbref, data);
}
}
Поплавки имеют только определенный уровень точности, вы можете выйти за пределы того, насколько точным может быть тип данных с плавающей точкой. Вместо этого попробуйте использовать DOUBLE.
Вы преодолеваете уровень точности. Вам нужно определить float с большей точностью, т. Е. «FLOAT (10,5)» будет означать float, который может иметь 10 цифр, всего с точностью до пяти после десятичной точки.
Поплавок имеет 6 цифр точности. Используйте double, чтобы получить 15 или переключитесь на числовое (x, y). Если вам интересно, ознакомьтесь с требованиями к хранению для MySQL для разных типов данных.
В руководстве MySQL указано, что поля FLOAT, REAL, and DOUBLE PRECISION
сохраняют значения как приблизительные, а поля INTEGER, SMALLINT, DECIMAL, and NUMERIC
сохраняют значения как точные.
Я думаю, что лучше всего решить эту проблему с точностью до десятичной.
Ссылка: http://dev.mysql.com/doc/refman/5.1/en /numeric-types.html
Более высокая точность альтернативы float - DOUBLE
. Но, глядя на пример, я думаю, что тип данных DECIMAL
может пригодиться, если количество цифр, необходимых после нуля, невелико (около 2-4), а число цифр до десятичного числа также невелико (около 10-12).