Как реализовать шаблон поиска или создания в firestore - PullRequest
0 голосов
/ 03 июня 2018

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
    });
}

Это делает мое универсальное создание длиннее (и неоправданно так при выполнении просто создания),Скажите, пожалуйста:

  1. Является ли DocumentSnapshot верной "валютой" для этих функций для трафика?
  2. Я застрял с set (), а затем другой запрос при создании нового объекта?

Спасибо!

РЕДАКТИРОВАТЬ В качестве примера, где я мог бы применить это, скажем, у меня есть клиенты, уникально идентифицированные по электронной почтеи они имеют статус: «золото», «серебро» или «бронза».Моя CRM-система решает, что кто-то, идентифицирующий себя как doug@stevenson.com, заслуживает «серебряного» статуса.На данный момент мы не знаем, является ли г-н Стивенсон текущим клиентом, поэтому мы делаем поиск или создание ...

findOrCreateCustomer({ email:'doug@stevenson.com' }).then(customer => {
    customer.update({ status:'silver' });
});

Я бы не просто создал, потому что клиент может существовать,Я не буду просто обновлять, потому что клиент может не существовать или не соответствовать какому-либо другому критерию для обновления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...