猫鼬虚拟填充返回null

时间:2019-01-23 12:24:05

标签: javascript mongoose graphql

我正在建立猫鼬和GraphQL的后端,但是猫鼬中的虚拟填充存在一些问题。

这是一个在mongoose的5.4.0版和node的11.5.0版上运行的node.js应用程序。我试图遵循这两个指南,但没有成功

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显示为null。

下面是mongo中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对象的游戏对象,但它返回null。如果有人可以看看我的问题,我会很乐意的。

2 个答案:

答案 0 :(得分:0)

命名集合时出了点问题。猫鼬通常将“ es”添加到集合名称中,如复数形式。在猫鼬mongoose.set("debug", true);中启用调试并发现它正在寻找错误的集合之后,我弄清楚了这一点。在这种情况下,集合名称缺少“ es”。

此堆栈溢出线程对其进行了一些解释

Why does mongoose always add an s to the end of my collection name

我通过在我的猫鼬模式选项中添加collection: "gameStatus"来解决了这个问题。

答案 1 :(得分:0)

默认情况下虚拟字段不活动。
您应该将它们设置为活动字段。像这样

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