mongodb - 在 express (async/await) 中使用一个 mongoose 查询的输出作为另一个查询的输入
问题描述
我正在使用 express 和 mongoose 来实现服务器/数据库。我有一条工作路线,可以通过 playerID 获取所有涉及玩家的游戏。我现在正在尝试实现一个可以使用用户名而不是 playerID 的方法。
PLAYER_SCHEMA:
const mongoose = require('mongoose');
const PlayerSchema = mongoose.Schema( {
username: {
type:String,
required:true,
unique:true
},
date_registered: {
type: Date,
default:Date.now
}
});
module.exports = mongoose.model('Player', PlayerSchema);
GAME_SCHEMA:
const mongoose = require('mongoose');
const GameSchema = mongoose.Schema( {
player_1: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Player',
required: true
},
player_2: {
type: mongoose.Schema.Types.ObjectId,
ref: 'Player',
required: true
},
status: {
type:String,
},
hero_1: {
type:String
},
hero_2: {
type:String
},
date_registered: {
type: Date,
default:Date.now
}
});
module.exports = mongoose.model('Game', GameSchema);
以下是我必须通过 playerId 查询所有涉及玩家的游戏:
//GET GAMES INVOLVING PLAYER BY PLAYER_ID
router.get('/player/:playerId', async (req, res) => {
try {
const games = await Game.find({$or:[{ player_1: req.params.playerId }, { player_2: req.params.playerId}]});
console.log(games)
res.json(games);
// weird cuz doesn't throw error if not found, just returns empty list...
}
catch (err) {
res.json({ message: err });
}
});
以下概述了我想要做的事情,但它不起作用,因为我确信有很多原因:
我试图先从用户名中获取 userId,然后将其传递给游戏查询。
//GET ALL GAMES ASSOCIATED WITH PLAYER BY USERNAME
router.get('/username/:username', async (req, res) => {
try {
const player = await Player.findOne({username:req.params.username});
console.log(player);
const games = Game.find({ $or:[{ player_1: player._id }, { player_2: player._id }] });
res.json(games);
}
catch (err) {
res.json({ message: err });
}
});
我一直在阅读有关 .populate()、promise 和瀑布的内容,但我是新手,希望得到一些指导!
解决方案
请试试这个:
//GET ALL GAMES ASSOCIATED WITH PLAYER BY USERNAME
router.get('/username/:username', async (req, res) => {
try {
const player = await Player.findOne({ username: req.params.username });
console.log(player);
/**
* .findOne() should return a document or null - if no match found..
*/
if (player) {
/**
* .find() will return empty [] only if it didn't find any matching docs but won't throw an error in successful DB operation
* (irrespective of whether docs matched or not, if op is successful then there will be no error).
*/
const games = await Game.find({ $or: [{ player_1: player._id }, { player_2: player._id }] }).lean();
(games.length) ? res.json(games) : res.json(`No games found for ${player._id}`);
} else {
res.json('No player found')
}
}
catch (err) {
res.json({ message: err });
}
});
推荐阅读
- sql-server - SQL Server:使用 CTE 展开视图
- php - Laravel Eloquent 删除事件未触发
- artifactory - 当我分发发布包时,附加到人工制品的人工制品属性是否复制到边缘节点
- azure-media-services - 如何将图像作为信箱放入视频中
- c++ - 如何模板括号?
- c++ - WideCharToMultiByte 不在英语操作系统上转换日语
- flutter - Flutter 事件通道和方法通道性能
- javascript - nodejs运行服务器时如何在前端访问全局变量/或使用的端口
- azure-cli - 在 Azure CLI 中连接查询表达式
- ios - Firebase Crashlytics 作为 pod 依赖项