2017-06-08 59 views
0

我正在努力使用猫鼬填充嵌套数组。需要帮助填充猫鼬中的嵌套数组

我有一个配方模型看起来是这样的:

let recipeSchema = Schema({ 

    name: { 
    type: String, 
    required: true 
    }, 

    description: { 
    type: String, 
    }, 

    steps: { 
    type: String, 
    required: true, 
    }, 

    ingredients: [], 

    reviewsArray: [{ type: Schema.Types.ObjectId, ref: 'Review' }], 

    category: { 
    type: String, 
    required: true, 
    }, 

    postedBy: [{type: Schema.Types.ObjectId, ref: 'User'}], 

    numberOfRatings: { 
    type: Number, 
    default: 0 
    }, 

    totalAddedRatings: { 
     type: Number, 
     default: 0 
    }, 

    reviewAverage: { 
     type: Number, 
     default: undefined 
    }, 

}); 

而且我也有一个用户模式:

let User = Schema({ 

    name: { 
    type: String 
    }, 

    // The passport plugin already inputs username and password into our Schema 

    username: { 
    type: String, 
    unique: true, 
    required: true 
    }, 

    password: { 
    type: String, 
    required: true, 
    minlength: 6 
    }, 

    userId: { 
    type: String, 
    default: "Empty" 
    }, 

    tokens: [{ 

    access: { 
     type: String, 
     required: true 
    }, 

    token: { 
     type: String, 
     required: true 
    } 

    }], 

    profilePic: { 
    type: String 
    }, 

    email: { 
    type: String, 
    unique: true, 
    required: true, 
    validate: { 
     validator: (value) => { 
     return validator.isEmail(value); 
     }, 

     message: `{value} is not a valid email address.` 
    } 
    }, 

    admin: { 
    type: Boolean, 
     defualt: false 
    }, 

    usersRecipes: [{ type: Schema.Types.ObjectId, ref: 'Recipe' }], 

    usersReviews: [{ type: Schema.Types.ObjectId, ref: 'Review' }], 

    usersFavouriteRecipes: { 
    type: Array 
    }, 

    usersLikedRecipes: { 
    type: Array 
    }, 

    chefKarma: { 
    type: Number, 
    defualt: 0 
    } 



}); 

每当用户进行一个新的配方,我想那配方也存储在usersRecipe数组中。代码,我尝试做的是这样的:

router.post('/addrecipe', (req, res, next) => { 

    Recipe.create({ 
     name: req.body.name, 
     description: req.body.description, 
     steps: req.body.steps, 
     ingredients: req.body.ingredients, 
     category: req.body.category, 
     postedBy: req.body.postedBy 
    }); 


    User.find({_id: req.body.postedBy}) 
     .populate({ 
      path: 'usersRecipes', 
      model: 'Recipe' 
     }) 
     .exec(function(err, docs) {}); 


    }); 

我的代码不工作,因为我打算虽然。任何人都可以向我解释我做错了什么?

+2

我想你是混淆人口与更新。如果要在用户文档中插入配方参考,则需要更新用户文档。 “填充”只能找到并填充真实文档的引用,而不是插入它们。 –

+0

如果我使用更新,我应该摆脱usersRecipes:[{类型:Schema.Types.ObjectId,ref:'食谱'}],? – MountainSlayer

回答

0

这是你在做什么? 保存像

{ 
     name: "hot chips", 
     description: "some goods", 
     steps: "2", 
     ingredients: "", 
     category: "chips", 
     postedBy: "12312312312312" 
} 

食谱然后搜索用户与12312312312312 ID,有些用户喜欢这个

{ 
    name:"farshad", 
    usersRecipes: [] 
} 

然后说填充的usersRecipes我... 你有没有得到你的错误? 你不写在你的用户文件中的食谱ID。所以userRecipes总是空的...所以每次你都没有得到任何的用户菜单。

你有两个解决方案 1.当过用户创建配方,写usersRecipes该配方ID ... 你可以创建...

recipe.save().then(function(res) { 
    //update user document userrecipes array 
}); 

OR 2.每个时间你用户,搜索食谱收集与该用户ID

Users.find({id:""}).exec(function(err, user) { 
    if (err) throw err; 
//fill userrecipes 
    Recipes.find().... 
});