MongoDB填充返回null

时间:2020-08-04 05:23:29

标签: node.js mongodb mongoose mongoose-schema

我试图用项目填充用户模式,但是由于某种原因,它没有将任何内容填充到用户模式中。有人可以看看。我的数据库中有1个用户和1个属于该用户的项目,但是没有任何内容,因此我一直看到null。

用户架构

var mongoose = require('mongoose')

var userSchema = mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    discordID: {
        type: String,
        required: true
    },
    discordImage: {
        type: String,
        required: true
    },
    items: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Item'
    }]
})

const User = module.exports = mongoose.model('User', userSchema)

项目架构

var mongoose = require("mongoose")

var itemSchema = mongoose.Schema({
    name: {
        type: String,
        required: true
    },
    purchasedPrice: {
        type: Number,
        required: true
    },
    purchasedDate: {
        type: String,
        required: true
    },
    author: {
        type: mongoose.Schema.Types.ObjectId,
        required: true,
        ref: "User"
    }
})

const Item = module.exports = mongoose.model("Item", itemSchema)

填充代码

app.get("/inventory", async (req, res) => {
    try {
        await req.user.populate({
            path: 'items'
        }).execPopulate()
        console.log(req.user)
    } catch (error) {
        console.log(error)
    }
    res.status(200).render("inventory.ejs", { currentUser: req.user })
})

数据库中的对象:

项目:

enter image description here

用户:

enter image description here

2 个答案:

答案 0 :(得分:0)

在用户架构上使用虚拟方法创建关联

userSchema.virtual("items", {
    ref: "Item",
    localField: "_id",
    foreignField: "author"
})

使用原始代码可以正常工作

答案 1 :(得分:-1)

我一直看到null。

没有它只是空的

提示没有添加到您的用户的项目。您需要具有一些可以填充的ID。

所有填充操作都是将ObjectID转换为文档。 没有任何魔法可以将itemSchema.authoruserSchema.items同步。

因此,仅将作者添加到项目中是不够的。您还需要将该项目添加到作者。

因此,例如,您可以添加以下项目:

const item = new Item({author: user._id});
await item.save();
req.user.items.push( item );
await req.user.save();

现在,当您登录req.user时,那里有任何项目吗?

一旦看到objectIds,您就可以返回并将.populate('items')添加到组合中,我保证您可以使用。