首页 > 解决方案 > Mongoose:根据 id 填充数组

问题描述

我有一个小型 CRUD 应用程序,其中用户经过身份验证并且能够创建/添加到收藏夹一些食谱。一段时间以来,我一直坚持添加到收藏夹。

这是我的用户架构:

const UserSchema = Schema({
    googleId: String,
    name: String,
    favorites: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Recipe' }],
});

这是我的食谱模式:

const RecipeSchema = new Schema({
    title: {
        type: String,
        required: [true, 'Title of the recipe is required'],
    },
    category: {
        type: Array,
        required: [true, 'Category is required'],
    },
    description: {
        type: String,
        required: [true, 'Description is required'],
    },
    imgUrl: {
        type: String,
        required: [true, 'Image is required'],
    },
    ingredients: {
        type: Array,
        required: [true, 'Ingredients are required'],
    },
    timeOfPreparation: {
        type: String,
        required: true,
    },
    preparation: {
        type: String,
        required: true,
    },
    sourceName: {
        type: String,
        required: true,
    },
    sourceUrl: {
        type: String,
        required: true,
    },
    fans: [{ type: mongoose.Schema.Types.ObjectId, ref: 'User' }],
});

两者都以这种方式从各自的文件中导出:

    const Recipe = mongoose.model('recipe', RecipeSchema);
    const User = mongoose.model('user', UserSchema);

    module.exports = Recipe;   
    module.exports = User;

用户通过护照进行身份验证,这部分工作正常。然后,当用户点击前端的收藏按钮(或者我在邮递员中发送请求)到端点(PUT)'/:userId/favorites'时,控制器然后转到收藏夹数组并推送一个新的 id:

exports.add_to_favorite = (req, res) => {
        const { recipeId } = req.body;

            User.findByIdAndUpdate(
                {
                    _id: req.params.userId,
                },
                { $addToSet: { favorites: recipeId } }
            ).then(() => {
                User.findById({
                    _id: req.params.userId,
                }).then(() => res.send(res.status));
            });
        };

但是,由于我想在前端显示收藏夹,而不仅仅是它们的 id,所以我找到了一种连接这两个集合的方法:mongoose 中的填充方法。然而,这并没有按预期工作,我得到了不确定:

exports.get_favorites = (req, res) => {
    User.findById({
        _id: req.params.userId,
    })
        .populate('favorites')
        .exec((err, recipe) => {
            console.log(recipe);
            res.send(recipe);
        });
};

我应该如何使用实际对象填充收藏夹数组,这些对象包含我在应用程序的前端部分渲染所需的数据?

标签: node.jsmongodbmongoose

解决方案


这听起来很傻,但我认为问题在于你用小写的 r, 导出你的配方模型recipe,但用大写的 R, 引用它Recipe。如果你让这些保持一致,我认为它会起作用..

注意:我认为您在模型中引用user模型时需要做同样的事情recipe


推荐阅读