Виртуальное заполнение Mongoose возвращает ноль - PullRequest
0 голосов
/ 23 января 2019

Я устанавливаю бэкэнд для mongoose и GraphQL, и у меня возникают некоторые проблемы с виртуальным заполнением в mongoose.

Это приложение node.js, работающее на версии 5.4.0 mongoose и версии 11.5.0 узла. Я безуспешно пытался следовать этим двум инструкциям

http://thecodebarbarian.com/mongoose-virtual-populate https://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.log(newGame);

Объект newGame даже не содержит свойства gameStatus. Если я добавлю .toJSON({virtuals: true}), gameStatus отобразится как ноль.

Ниже приведены примеры объектов JSON из Монго

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

1 Ответ

0 голосов
/ 23 января 2019

Что-то пошло не так, когда коллекция была названа. Mongoose обычно добавляет «es» к названию коллекции, как во множественном числе. Я понял это после того, как включил отладку в mongoose mongoose.set("debug", true); и увидел, что он ищет неправильную коллекцию. В этом случае в имени коллекции отсутствовало «es».

Этот поток переполнения стека объясняет это немного

Почему мангуста всегда добавляет s в конце названия моей коллекции

Я решил это, добавив collection: "gameStatus" к своим опциям схемы мангуста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...