mongoose.findOne() 返回 null

Posted

技术标签:

【中文标题】mongoose.findOne() 返回 null【英文标题】:mongoose.findOne() returns 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)

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

工作。谢谢!你有什么解释它为什么起作用吗? 我在答案中添加了解释。我猜发生的事情是,您使用某些数据创建了文档,当您再次执行此操作时,您没有使用完全相同的数据执行此操作,因此并非满足 findOne() 中的所有条件导致它说有'不是一个现有的文档,它必须创建一个。 是的,有道理。再次感谢!

以上是关于mongoose.findOne() 返回 null的主要内容,如果未能解决你的问题,请参考以下文章

Mongoose findOne() 和 find() 返回无效值,它们应该分别返回 null / 空列表

Mongoose findOne as : Array = [FindOne , FindOne, FindOne ,FindOne, FindOne...] ,使用 ExpressJs

承诺问题:使用 Q.nfcall() 调用 mongoose.findOne()

如何使用mongoose findOne

mongoose.findOne() 后数组被清除

Mongoose `findOne` 操作在 10000 毫秒后超时