updateDoc 不接受变量作为字段名

Posted

技术标签:

【中文标题】updateDoc 不接受变量作为字段名【英文标题】:updateDoc doesn't accept variable as field name 【发布时间】:2021-12-24 17:36:19 【问题描述】:

我使用来自 fireStore 的函数 updateDoc。我也使用 VueJs 作为框架。我尝试使用用户输入 (member_name) 作为字段名称来创建嵌套文档。但是,我一直收到“意外关键字'this'。(42:20)”的错误。问题出在这部分。

this.member_name: 
      name: this.member_name,
      task: 0,
      task_status: 0,

你能帮我解决吗?以下是完整代码

<template>
    <div class="container shadow m-3 col-12">
    <div class="d-flex justify-content-center m-2">
        <h1>Add Member</h1>
    </div>
    <label for="member_name">Member name</label>
    <input class="form-control m-1" type="text" id="member_name" v-model="member_name"/>       
    <label for="member_email">Member Email</label>
    <input class="form-control m-1" type="email" id="member_email" v-model="member_email"/>       
    <div class="d-flex justify-content-center">
        <button @click.prevent="submit" class="btn btn-primary col-6 m-2">Submit</button>
    </div>
    </div>   
</template>

<script>
import firebaseApp from '@/firebase.js'
import  getFirestore  from "firebase/firestore"
import  doc, updateDoc from "firebase/firestore"
const db = getFirestore(firebaseApp);

import  getAuth, onAuthStateChanged  from "firebase/auth";

export default 
    name: "AddMember", 
    components: 
        
    , 
    data()
        return
            email:"",
            project_name:"",
            member_name:"",
            member_email:"",
        
    ,

    mounted()
        const auth = getAuth();
        onAuthStateChanged(auth, (user) => 
        if (user) 
            this.email = user.email
            console.log(this.email)
         else 
            console.log("Sorry")
        
        );
    ,

    methods: 
        async submit() 
            alert("Add new member successfully!")
            this.project_name = this.$route.query.project_name
            const projectDoc = doc(db, "projects", this.project_name);
            await updateDoc(projectDoc, 
                member_list: 
                    this.member_name: 
                        name: this.member_name,
                        task: 0,
                        task_status: 0,
                      
                ,
            );
        
    ,

</script>

<style>

</style>

【问题讨论】:

【参考方案1】:

您可以使用[] 表示法将变量的值用作属性名称:

await updateDoc(projectDoc, 
    member_list: 
        [this.member_name]:  // ?
            name: this.member_name,
            task: 0,
            task_status: 0,
          
    ,
);

除此之外:如果您想将成员添加到现有的member_list 数组中,您需要使用array-union 运算符,如updating elements in an array field 上的文档中所示。

【讨论】:

有效!!非常感谢!【参考方案2】:

您正在尝试为文档设置错误的值。在这段代码中:

await updateDoc(projectDoc, 
    member_list: 
        this.member_name: 
            name: this.member_name,
            task: 0,
            task_status: 0,
          
    ,
);

第三行应该声明对象的结构,但你引用的是一个值,这是错误的。

正确的方法是这样的:

await updateDoc(projectDoc, 
    member_list: 
        member_name:  // <- or use whatever you want to define this object
            name: this.member_name,
            task: 0,
            task_status: 0,
          
    ,
);

【讨论】:

我希望字段名称是用户的输入,而不仅仅是固定字段的名称。我尝试删除“this”,但现在 firebase 只是将其存储为“member_name”,而不是用户的输入。有没有办法将对象引用到值?

以上是关于updateDoc 不接受变量作为字段名的主要内容,如果未能解决你的问题,请参考以下文章

MYSQL 数据库名表名字段名查询

Oracle 查询库中所有表名字段名字段名说明,查询表的数据条数表名中文表名

获取所有数据库名表名字段名

PostgreSQL中表名字段名大小写问题

SQLServer中获取所有数据库名表名字段名以及描述

select数据查询