如何在firestore

时间:2018-06-03 19:43:12

标签: javascript firebase google-cloud-firestore

firestore api让我有点混淆,试图找到一个可重复的模式来查找或创建样式函数。我希望规范版看起来像这样:

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

假设我是对的(如果没有,请告诉我),这意味着find和create函数都必须返回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;
    });
}

......但是对于创作和我的问题的要点来说相当尴尬。我想写这样的创作....

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的非null承诺”。空虚吗?我必须读回我刚写的对象才能获得它的引用?换句话说,我的理想化创作需要被重写为更慢和更笨拙......

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()然后另一个查询?
  3. 谢谢!

    编辑作为我应用此处的示例,请说我有客户,通过电子邮件进行唯一标识,并且他们的状态为:'gold','silver'或'bronze'。我的CRM系统决定将自己标识为doug@stevenson.com的人应该获得“白银”身份。我们现在还不知道史蒂文森先生是现任客户,所以我们做了一个发现或创造...

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

    我不会创建,因为客户可能存在。我不会更新,因为客户可能不存在,或者可能不符合更新的其他标准。

0 个答案:

没有答案