Виртуальное заполнение мангуста возвращает ноль

Я настраиваю бэкэнд на мангусте и 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. Было бы здорово, если бы кто-нибудь взглянул на мою проблему.

Можете ли вы показать мне, где вы создаете модели? И как вы его создаете?

Muhammad Faizan 23.01.2019 13:35

Я не уверен, что понимаю ваш вопрос @MuhammadFaizan. Они создаются в отдельных файлах. Мангуст импортируется, а модель экспортируется. В папке с моделями есть файл index.ts, в котором все модели экспортируются в виде модулей. const Game = mongoose.model("Game", gameSchema); export default Game;

Jørgen Vik 23.01.2019 13:52

Я не думаю, что это связано, но вы должны добавить toJSON и toObject в параметры рядом с временными метками: true

BenSower 23.01.2019 14:15

@BenSower Да. Я запрашиваю следующий идентификатор, который представлен в обоих объектах выше: 5c472bc4b6b5f745bbbd7f6a. Также я попытался переместить toJSON и toObject в фигурную скобку, содержащую временные метки, но это не имело значения.

Jørgen Vik 23.01.2019 14:19

можете ли вы проверить этот автономный смысл и посмотреть, работает ли он для вас? gist.github.com/BenSower/d20479c18cdd77ded3cf1dbbb0230b50 Он использует mongoose 5.4.2 и mongodb 3.6.3.

BenSower 23.01.2019 14:25

@BenSower Суть, которую вы мне прислали, работает отлично, и объект заполнен правильно, но я не понимаю, где я облажался в своем коде. Я даже установил ту же версию мангуста.

Jørgen Vik 23.01.2019 14:35

Хорошо, можете ли вы также создать очень минималистичный смысл всей вашей настройки кода, чтобы воспроизвести проблему?

BenSower 23.01.2019 14:56

Я попытался воспроизвести проблему в общих чертах, но буквально не могу. Однако я включил отладку мангуста и из своих журналов вижу, что мангуст пытается искать в коллекции под названием «gamestatuses» вместо «GameStatus». Забавно, но я нигде не могу найти «статусы игры» в своем коде. Mongoose: gamestatuses.findOne({ gameID: ObjectId("5c472bc4b6b5f745bbbd7f6a") }, { projection: {} })

Jørgen Vik 23.01.2019 15:31
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
8
1 637
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Что-то пошло не так, когда коллекция была названа. 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

Другие вопросы по теме