Mongodb 在express中将一个mongoose查询的输出用于另一个mongoose查询的输入(异步/等待)
我正在使用express和mongoose实现一个服务器/db。我有一个工作路线,让所有的游戏涉及到一个球员的playerID。我现在正在尝试实现一个可以使用username而不是playerID的 播放器模式:Mongodb 在express中将一个mongoose查询的输出用于另一个mongoose查询的输入(异步/等待),mongodb,express,mongoose,mongoose-schema,Mongodb,Express,Mongoose,Mongoose Schema,我正在使用express和mongoose实现一个服务器/db。我有一个工作路线,让所有的游戏涉及到一个球员的playerID。我现在正在尝试实现一个可以使用username而不是playerID的 播放器模式: const mongoose = require('mongoose'); const PlayerSchema = mongoose.Schema( { username: { type:String, required:true, unique:tru
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);
游戏模式:
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);
以下是我必须查询的所有游戏,涉及玩家ID的玩家:
//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 });
}
});
以下概述了我想做的事情,但它不起作用,原因肯定有很多:
我试图首先从username获取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()、promissions和瀑布的书,但我对这方面还不熟悉,希望能得到一些指导 请尝试以下操作:
//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 });
}
});
非常感谢。这成功了!你能解释一下为什么这样做而我的不这样做吗?@emsha:正如我在回答中所说的,如果mongoDB没有找到匹配的文档,它将在
上返回null
。因此,基本上我们只是使用if
块来验证我们的DB结果,而不是检查实际错误,所有实际错误都将被catch
块捕获,而且我想我忘了在游戏开始前放置wait
。查找,您可以包含在代码中。。