Javascript Firebase:如何创建嵌套对象

Javascript Firebase:如何创建嵌套对象,javascript,firebase,web,google-cloud-firestore,Javascript,Firebase,Web,Google Cloud Firestore,对于如何更新Firebase记录的嵌套属性有一些问题,但对于如何创建具有嵌套属性的记录没有答案 与之相似,但没有帮助 从web上,目标是创建具有嵌套属性的Firebase记录 使用点表示法可以进行更新,但在重复使用同一个键创建记录时,不会创建嵌套的层次结构 这是有意义的,因为键不传递有关子属性的数据类型的任何信息 创建具有嵌套属性的对象的正确方法是什么 async test(serviceId, numCredits, emailAddress) { // Set credits key

对于如何更新Firebase记录的嵌套属性有一些问题,但对于如何创建具有嵌套属性的记录没有答案

与之相似,但没有帮助

从web上,目标是创建具有嵌套属性的Firebase记录

使用点表示法可以进行更新,但在重复使用同一个键创建记录时,不会创建嵌套的层次结构

这是有意义的,因为键不传递有关子属性的数据类型的任何信息

创建具有嵌套属性的对象的正确方法是什么

async test(serviceId, numCredits, emailAddress) {
    // Set credits key.
    let creditsKey = `credits.${serviceId}.numAllowed`;

    try {
        // Get user matching @emailAddress.
        let user = await this.getUser(emailAddress);

        // New user? Create database record.
        if (!user) {
            this.db_
                    .collection('users')
                    .add(
                        {
                            emailAddress: emailAddress,
                            [{creditsKey}]: numCredits
                        }
            );

        // Nope, user exists so update his/her record.
        } else {
            // Set update query.
            let query = this.db_
                                    .collection('users')
                                    .where('emailAddress', '==', emailAddress);

            // Run update query.
            const querySnapshot = await query.get();
            return querySnapshot.docs[0].ref.update({
               [creditsKey]: firebase.firestore.FieldValue.increment(numCredits)
            });
        }
    } catch(e) {
        debug('Error in test(): ' + e);
    }
}

如果我正确理解了你的问题,下面就可以了。(不过,可能还有更优雅的解决方案……)


我们找不到更优雅的解决方案,这也是我们最后要做的。谢谢你的帮助!
  const obj = {};
  obj.numAllowed = numCredits;
  const obj1 = {};
  obj1[serviceId] = obj;

  // ...

  this.db_.collection('users')
     .add(
         {
            emailAddress: emailAddress,
            credits: obj1
         })