猫鼬:根据ID填充数组

时间:2019-02-21 18:40:52

标签: node.js mongodb mongoose

我有一个小的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:< / p>

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,所以我找到了一种方法来连接这两个集合:猫鼬中的填充方法。但是,这没有按预期工作,我无法定义:

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

如何在我的收藏夹数组中填充实际对象,这些对象包含我需要在应用程序前端呈现的数据?

1 个答案:

答案 0 :(得分:1)

这听起来似乎很愚蠢,但是我认为问题在于,您以小写字母r recipe导出配方模型,而以大写字母R Recipe引用配方模型。如果您使这些保持一致,我认为它会起作用。

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