Хорошо, я ударяю головой, попробовав этот код 50 различными способами.Возвращаемое значение FindOne mongoose nodejs
Итак, у меня есть образец игры, в которую играют 2v2, в каждой игре Schema игроки ссылаются на пользователя и по имени пользователя.
Теперь в игре я хочу получить рейтинги от этих пользователей и обновить их соответственно, это должно произойти в одно и то же время.
Я, похоже, не могу получить доступ к своим пользовательским объектам (исходя из долгого времени Java, поэтому некоторые из них просто прямо не имеют смысла).
Если возможно, я хотел бы расширить это, поэтому огромная вложенная куча кода не является тем, что я ищу.
Без дальнейших разглагольствуя:
gameSchema:
var gameSchema = mongoose.Schema({
teamA_player1: { type: String, ref: "userModel", required: true},
teamA_player2: { type: String, ref: "userModel", required: true},
teamB_player1: { type: String, ref: "userModel", required: true},
teamB_player2: { type: String, ref: "userModel", required: true},
teamA_score: { type: Number, required: true},
teamB_score: { type: Number, required: true},
author: { type: String, ref: "userModel", required: true},
verification: [{ type: String, ref: "userModel", required: true}],
verified: { type: Boolean},
timestamp: { type: Date}
});
userSchema:
var userSchema = mongoose.Schema({
username: { type: String, required: true, unique: true},
password: { type: String, required: true},
firstName: { type: String},
lastName: { type: String},
about: { type: String},
email: { type: String},
clubs: { type: [{type: ObjectId, ref: "clubModel"}]},
games: { type: [{type: ObjectId, ref: "gameModel"}]},
rating: { type: Number}
});
Вопрос с моим кодом в моем gameController:
updateRating = function(game){
// The following code blob doesn't work and calling a_1.rating just gives Nan/undefined.
var a_1 = users.findOne({username: game.teamA_player1});
var a_2 = users.findOne({username: game.teamA_player2});
var b_1 = users.findOne({username: game.teamB_player1});
var b_2 = users.findOne({username: game.teamB_player2});
var a_rating_old = (a_1.rating+a_2.rating)/2;
var b_rating_old = (b_1.rating+b_2.rating)/2;
var a_rating_new = 0;
var b_rating_new = 0;
if(game.teamA_score>game.teamB_score){
a_rating_new = ratingChange(a_rating_old, b_rating_old, true);
b_rating_new = ratingChange(b_rating_old, a_rating_old, false);
}else{
a_rating_new = ratingChange(a_rating_old, b_rating_old, false);
b_rating_new = ratingChange(b_rating_old, a_rating_old, true);
}
var a_rating_change = a_rating_new - a_rating_old;
var b_rating_change = b_rating_new - b_rating_old;
a_1.rating += Math.round(a_rating_change * (a_rating_old/a_1.rating));
a_2.rating += Math.round(a_rating_change * (a_rating_old/a_2.rating));
b_1.rating += Math.round(b_rating_change * (b_rating_old/b_1.rating));
b_2.rating += Math.round(b_rating_change * (b_rating_old/b_2.rating));
a_1.save();
a_2.save();
b_1.save();
b_2.save();
}
Поэтому в основном я m w от того, что будет правильным путем для приобретения моих пользователей здесь, извлечь их рейтинги, обновить их, а затем сохранить пользователей с новыми рейтингами (сама игра не претерпевает никаких изменений).
код может также быть найдены здесь: https://github.com/mathieudevos/pinkiponki
Это ограничивает мою a_1 в пределах функции, что делает меня неспособным использовать его вне функция (err, user) {// здесь код и var}. Я хочу показать его моей функции updateRating, работать с рейтингами там и обновлять их там. –
Вам нужно будет объявить переменную снаружи. –