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

使用MongoDB推送数据遇问题:$push操作后BetSaver数组为空

MongoDB $push操作后输出数组为空的问题解决

你当前代码的核心问题是查询操作先于更新执行:rulet变量获取的是更新前的旧文档数据,所以即便后续执行了$push向BetSaver数组添加元素,打印的依然是更新前的空数组。

两种解决方式:

方式1:先更新,再重新查询最新数据

const betSave = async (guild, space2, money, user) => {
    const data = {
        space: space2,
        amount: money,
        author: user
    };
    // 先执行更新操作
    await roullete2.updateOne({GuildID: guild.id}, {$push: {BetSaver: data}});
    // 更新完成后查询最新文档
    const rulet = await roullete2.find({GuildID: guild.id});
    console.log(rulet[0].BetSaver);
};

方式2:用findOneAndUpdate直接获取更新后的文档(更高效)

通过设置returnDocument: 'after',可以在一次数据库操作中完成更新并拿到最新数据,减少请求次数:

const betSave = async (guild, space2, money, user) => {
    const data = {
        space: space2,
        amount: money,
        author: user
    };
    const updatedRulet = await roullete2.findOneAndUpdate(
        {GuildID: guild.id},
        {$push: {BetSaver: data}},
        {returnDocument: 'after', upsert: true} // upsert可选:无匹配文档时自动创建
    );
    console.log(updatedRulet.BetSaver);
};

额外注意事项:

  • 如果GuildID: guild.id没有匹配到任何文档,updateOne不会自动创建新文档,此时可以添加upsert: true选项(如方式2所示),确保新文档会被创建并执行$push。
  • 确认集合中文档的BetSaver字段是数组类型,$push只能对数组字段生效。

内容的提问来源于stack exchange,提问作者Brks

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 05:32:50