API Firestore немного запутал меня, пытаясь создать повторяющийся шаблон для функций стиля поиска или создания.Мне бы хотелось, чтобы каноническая версия выглядела следующим образом:
// returns a promise resolving to a DocumentSnapshot (I think??)
function findOrCreateMyObject(myObject) {
return findMyObject(myObject.identifier).then(documentSnapshot => {
return (documentSnapshot)? documentSnapshot : createMyObject(myObject);
});
};
Я не уверен, является ли DocumentSnapshot соответствующим возвращением из этого, но я полагаю, что вызывающая сторона может захотеть проверить или обновить результат, подобный следующему:
return findOrCreateMyObject({ identifier:'foo' }).then(documentSnapshot => {
console.log(documentSnapshot.data.someProperty);
return documentSnapshot.ref.update({ someProperty:'bar' });
});
Предполагая, что я прав в этом (пожалуйста, скажите мне, если нет), это означает, что и функции поиска, и создания должны возвращать DocumentSnapshot.Это достаточно просто для поиска ...
function findMyObject(identifier) {
let query = db.collection('my-object-collection').where('identifier','=='identifier);
return query.get().then(querySnapshot => {
return (querySnapshot.docs.length)? querySnapshot.docs[0] : null;
});
}
... но довольно неловко для творения и сути моей проблемы.Я бы хотел написать create следующим образом ...
function createMyObject(myObject) {
// get db from admin
let collectionRef = db.collection('my-object-collection');
return db.collection('my-object-collection').doc().set(myObject);
}
Но я не могу, потому что DocumentReference set()
разрешает "ненулевое обещание, содержащее void".Пустота?Я должен прочитать обратно объект, который я только что написал, чтобы получить ссылку на него?Другими словами, мое идеализированное создание необходимо переписать так, чтобы оно было медленнее и громоздче ...
function createMyObject(myObject) {
// get db from admin
let collectionRef = db.collection('my-object-collection');
return db.collection('my-object-collection').doc().set(myObject).then(() => {
// must we query the thing just written?
return findMyObject(myObject.identifier); // frowny face
});
}
Это делает мое универсальное создание длиннее (и неоправданно так при выполнении просто создания),Скажите, пожалуйста:
- Является ли DocumentSnapshot верной "валютой" для этих функций для трафика?
- Я застрял с set (), а затем другой запрос при создании нового объекта?
Спасибо!
РЕДАКТИРОВАТЬ В качестве примера, где я мог бы применить это, скажем, у меня есть клиенты, уникально идентифицированные по электронной почтеи они имеют статус: «золото», «серебро» или «бронза».Моя CRM-система решает, что кто-то, идентифицирующий себя как doug@stevenson.com, заслуживает «серебряного» статуса.На данный момент мы не знаем, является ли г-н Стивенсон текущим клиентом, поэтому мы делаем поиск или создание ...
findOrCreateCustomer({ email:'doug@stevenson.com' }).then(customer => {
customer.update({ status:'silver' });
});
Я бы не просто создал, потому что клиент может существовать,Я не буду просто обновлять, потому что клиент может не существовать или не соответствовать какому-либо другому критерию для обновления.