【问题标题】:mongoose.findOne() returns nullmongoose.findOne() 返回 null
【发布时间】:2020-08-25 23:07:32
【问题描述】:

我正在制作一个不和谐的机器人,我想检查用户的 id 是否在数据库中,如果是则返回消息。 我当前的代码正在创建新数据,即使用户已经在数据库中有他的 ID:

let user = message.mentions.members.first() || bot.users.cache.get(args[0])
let userid = user.user.id

Data.findOne({
     userID: userid,
     serverID: message.guild.id,
     name: user.user.username,
     language: args[2],
     email: args[1],
      lb: "all",
}, (err, data) => {
     if (err) return console.log(err);

     if (!data) {
            const newData = new Data({
                name: user.user.tag,
                language: args[2],
                email: args[1],
                userID: userid,
                serverID: message.guild.id,
                lb: "all"
            })
            newData.save().catch(err => console.log(err));
            return message.channel.send("new data created")

        } else {
            if (data.userID === user.user.id) return message.reply("Already has his data.")
}
})

这是我的猫鼬方案代码:

const mongoose = require("mongoose");

const dataSchema = mongoose.Schema({
    name: String,
    language: String,
    email: String,
    userID: String,
    serverID: String,
    lb: String,
    usage: Number
})

module.exports = mongoose.model(`Data`, dataSchema)

【问题讨论】:

    标签: node.js database mongodb mongoose discord.js


    【解决方案1】:

    您不需要在 findOne() 中使用所有这些条件,您只需要使用 1 个唯一标识符,在本例中为 userID

    这就是它无法按预期工作的原因,除非所有条件都与现有用户数据中的条件相同,否则它不会找到它。

    Data.findOne({
         userID: userid
    }, (err, data) => {
         // do something
    })
    

    【讨论】:

    • 工作。谢谢!你有什么解释它为什么起作用吗?
    • 我在答案中添加了解释。我猜发生的事情是,您使用某些数据创建了文档,当您再次执行此操作时,您没有使用完全相同的数据执行此操作,因此并非满足 findOne() 中的所有条件导致它说有'不是一个现有的文档,它必须创建一个。
    • 是的,有道理。再次感谢!
    猜你喜欢
    • 2019-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-21
    相关资源
    最近更新 更多