Я настраиваю бэкэнд на мангусте и GraphQL, и у меня возникают проблемы с виртуальным заполнением в мангусте.
Это приложение node.js, работающее на версии 5.4.0 mongoose и версии 11.5.0 node. Я безуспешно пытался следовать этим двум руководствам.
http://thecodebarbarian.com/mongoose-virtual-populatehttps://thecodebarbarian.com/mongoose-4.13-virtual-populate-dynamic-refs-fields
const gameStatusSchema = new mongoose.Schema({
userID: String,
gameID: { type: mongoose.Schema.Types.ObjectId, ref: "Game"},
gameStatus: Number
}, {
timestamps: true,
toObject: { virtuals: true },
toJSON: { virtuals: true }
});
const gameSchema = new mongoose.Schema({
gameTitle: String,
gameDescription: String,
gameType: Number,
gameTypeID: String,
gamePosition: Number,
}, {
timestamps: true,
toObject: { virtuals: true },
toJSON: { virtuals: true }
});
gameSchema.virtual("gameStatus", {
ref: "GameStatus",
localField: "_id",
foreignField: "gameID",
justOne: true
});
const newGame = await Game.findById(id)
.populate("gameStatus");
console.info(newGame);
Объект newGame даже не содержит свойства gameStatus. Если я добавлю .toJSON({virtuals: true}), gameStatus будет отображаться как null.
Ниже приведены примеры объектов JSON из mongo.
gameStatus object
{
"_id" : ObjectId("5c473a872721eb7327377fa2"),
"userID" : "5c3629deed4593ab3b435614",
"gameID" : ObjectId("5c472bc4b6b5f745bbbd7f6a"),
"gameStatus" : 8
}
game Object
{
"_id" : ObjectId("5c472bc4b6b5f745bbbd7f6a"),
"gameTitle" : "Lotto",
"gameDescription" : "Test",
"gameType" : 1,
"gameTypeID" : "5c472bc4b6b5f745bbbd7f69",
"gamePosition" : 8,
"course" : ObjectId("5c35e5e53757a7a29c33565f"),
"createdAt" : ISODate("2019-01-22T14:42:12.267Z"),
"updatedAt" : ISODate("2019-01-22T14:42:12.267Z"),
"__v" : 0
}
Я ожидал, что приведенный выше код позволит мне запросить мой игровой объект и получить игровой объект с виртуально заполненным объектом gameStatus, но он возвращает null. Было бы здорово, если бы кто-нибудь взглянул на мою проблему.
Я не уверен, что понимаю ваш вопрос @MuhammadFaizan. Они создаются в отдельных файлах. Мангуст импортируется, а модель экспортируется. В папке с моделями есть файл index.ts, в котором все модели экспортируются в виде модулей. const Game = mongoose.model("Game", gameSchema); export default Game;
Я не думаю, что это связано, но вы должны добавить toJSON и toObject в параметры рядом с временными метками: true
@BenSower Да. Я запрашиваю следующий идентификатор, который представлен в обоих объектах выше: 5c472bc4b6b5f745bbbd7f6a. Также я попытался переместить toJSON и toObject в фигурную скобку, содержащую временные метки, но это не имело значения.
можете ли вы проверить этот автономный смысл и посмотреть, работает ли он для вас? gist.github.com/BenSower/d20479c18cdd77ded3cf1dbbb0230b50 Он использует mongoose 5.4.2 и mongodb 3.6.3.
@BenSower Суть, которую вы мне прислали, работает отлично, и объект заполнен правильно, но я не понимаю, где я облажался в своем коде. Я даже установил ту же версию мангуста.
Хорошо, можете ли вы также создать очень минималистичный смысл всей вашей настройки кода, чтобы воспроизвести проблему?
Я попытался воспроизвести проблему в общих чертах, но буквально не могу. Однако я включил отладку мангуста и из своих журналов вижу, что мангуст пытается искать в коллекции под названием «gamestatuses» вместо «GameStatus». Забавно, но я нигде не могу найти «статусы игры» в своем коде. Mongoose: gamestatuses.findOne({ gameID: ObjectId("5c472bc4b6b5f745bbbd7f6a") }, { projection: {} })



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Что-то пошло не так, когда коллекция была названа. Mongoose обычно добавляет «es» к названию коллекции во множественном числе. Я понял это после включения отладки в мангусте mongoose.set("debug", true); и увидел, что он ищет неправильную коллекцию. В этом случае в имени коллекции отсутствовало «es».
Этот поток переполнения стека немного объясняет это
Почему мангуст всегда добавляет букву s в конец названия моей коллекции
Я решил это, добавив collection: "gameStatus" в параметры схемы мангуста.
По умолчанию виртуальное поле не активно.
Вы должны установить их как активные поля. Нравится
user.set('toObject', { virtuals: true }); // add this
user.set('toJSON', { virtuals: true }); // add this
или это, если требуется
user.set('toObject', { virtuals: true }); // add this
user.set('toJSON', { virtuals: true }); // add this
user.plugin(mongooseLeanVirtuals); // add this
Можете ли вы показать мне, где вы создаете модели? И как вы его создаете?