在 mongoose 中查找文档并获取特定部分

Posted

技术标签:

【中文标题】在 mongoose 中查找文档并获取特定部分【英文标题】:Finding a document in mongoose and fetching a specific part 【发布时间】:2020-08-18 17:45:04 【问题描述】:

我将首先描述我想要实现的目标。我目前正在为我的 Destiny 2 Clan 开发一个不和谐的机器人,我正在尝试实现的命令之一是 joinid 命令,您可以在其中使用该命令和@一个用户,它会返回用户的 steamID。不幸的是,discord 机器人无法访问 discord 用户的连接。我想出的解决方案是为氏族成员进行 Oauth2 登录,当他们登录时,他们授权应用程序从 discord API 获取连接信息,然后将其保存在数据库中。 Oauth2 应用程序已完成并正在运行,问题在于机器人从数据库中获取数据。到目前为止,我只尝试了 Model.find,当我昨天尝试时,它返回的信息量远远超过包含的实际文档,但是今天它只返回 [object Object],所以我一定搞砸了代码。 可能值得一提的是,这是我的第一个 javascript 项目。

这是 MongoDB 文档的架构:

const UserSchema = new mongoose.Schema(
    discordId: type: String, required: true,
    username: type: String, required: true,
    connection: type: Array, required: true

);


const DiscordUser = module.exports = mongoose.model('User', UserSchema);

我附上了文档在数据库中的外观图片

这是我目前的命令代码:

if (cmd.includes("joinid")) 
        playerid = cmd.slice(10, -1);
        const steamidentifier = DiscordUser.find( discordId: playerid);
        console.log(`$steamidentifier`);
        
    

通过查看图像,您可以看到每个连接都有单独的对象(即 Spotify、battle.net、steam、twitch 等)但据我所知,steamID 是唯一的 ID仅由数字组成的 17 位数字,所以这就是我计划用来识别 steamID 的。 所以我要问的是,是否有一种方法可以首先使用 discordId 从数据库中获取实际文档,然后是否有一种方法可以轻松地从数组中选择实际的 steamID。

【问题讨论】:

【参考方案1】:

首先,如果您要查找 1 个文档,那么我建议您改用 findOne()

其次,您需要使用callback 函数来获取查询结果。

if (cmd.includes("joinid")) 
    playerid = cmd.slice(10, -1);
    const steamidentifier = DiscordUser.findOne(
        discordId: playerid
    , (err, res) => 
        console.log(res.connection.find(con => con.type === 'steam').id)
    );

【讨论】:

以上是关于在 mongoose 中查找文档并获取特定部分的主要内容,如果未能解决你的问题,请参考以下文章

如何获取文档 MangoDB&Mongoose 上的特定字段并聚合一些字段?

通过 Mongoose、Node.js、MongodB 中的特定属性查找嵌入式文档

使用 Mongoose 查找子文档字段部分匹配给定条件的文档

使用 Mongoose 查找子文档字段部分匹配给定条件的文档

Mongoose 查找并创建多维数组

通过 Id 查找文档并在 Mongoose 中过滤子数组