You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:50:54