Discord机器人Firestore子集合set方法无法识别问题求助
问题
开发了一个连接Firebase Firestore的Discord机器人,对主集合及文档执行get/set操作正常,但对子集合调用set方法时出现异常。
异常代码片段:
import discord from discord import app_commands from discord.ext import commands from firebase_admin import firestore db = firestore.client() class Upload(commands.Cog): def __init__(self, bot: commands.Bot): self.bot = bot @app_commands.command(name='upload', description="desc") async def upload(self, interaction: discord.Interaction, name: str, file: discord.Attachment): print(file.url) print(interaction.guild.id) db_server = db.collection("servers").document(str(interaction.guild.id)) db_drop_items = db_server.collection("drop_items") # 此处调用set方法报错,因为集合引用没有set方法 db_drop_items.set({"name" : name, "image": file.url}, merge=True) await interaction.response.send_message('Answered')
直接对主集合文档调用set方法可正常写入:
db_server = db.collection("servers").document(str(interaction.guild.id)) # db_drop_items = db_server.collection("drop_items") db_server.set({"name" : name, "image": file.url}, merge=True)
解决方案
报错核心原因:db_drop_items是集合引用,Firestore中集合没有set方法,set是文档引用的专属方法。要写入子集合,必须指定子集合内的具体文档:
方式1:指定自定义文档ID
如果需要自己定义文档的唯一标识(比如用传入的name作为ID),可以这样修改:
db_server = db.collection("servers").document(str(interaction.guild.id)) # 指定子集合中的文档ID db_drop_item = db_server.collection("drop_items").document(name) db_drop_item.set({"name" : name, "image": file.url}, merge=True)
方式2:自动生成文档ID
如果不需要自定义ID,让Firestore自动生成唯一文档ID,使用add方法即可:
db_server = db.collection("servers").document(str(interaction.guild.id)) db_drop_items = db_server.collection("drop_items") # add方法自动生成文档ID并写入数据 db_drop_items.add({"name" : name, "image": file.url})
注意:add方法用于创建新文档,无需merge=True参数;如果要更新已有文档,必须使用document(id).set(..., merge=True)的格式。
内容的提问来源于stack exchange,提问作者Efren Pineda
相关产品推荐
相关产品推荐

