2017-06-08 7 views
0

mongooseを使用してネストされた配列を作成するのに苦労しています。mongooseでネスト配列を作成するのに役立つ必要があります

私は次のようになりますレシピモデルがあります:

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 
    }, 

}); 

をそして、私はまた、Userモデルがあります:ユーザーが新しいレシピを作るたび

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

私は人口が更新と混乱していると思います。ユーザー文書にレシピ参照を挿入する場合は、ユーザー文書を更新する必要があります。 'populate'は参照を実際の文書でしか見つけず、挿入しません。 –

+0

私はupdateを使うと、usersRecipesを取り除かなければなりません:[{type:Schema.Types.ObjectId、ref: 'Recipe'}]? – MountainSlayer

答えて

0

...

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

のようなレシピを保存はその後、12312312312312 IDを持つユーザーのために、この

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

のようないくつかのユーザーを検索し、ためusersRecipesを移入言います私... あなたは間違いをしますか? あなたのユーザー文書にそのレシピIDを書き込まないでください。だから、userRecipesは常に空です...毎回、あなたはどんなusersRecipesも取得しません。

あなたは今までにユーザーがusersRecipesにそのレシピIDを書き込み、レシピを作成して2つのソリューション 1を持っている... あなたが作成することができます...

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

OR あなたが得る2.every時間は、そのユーザーIDを持つレシピのレシピコレクション内で検索してください

Users.find({id:""}).exec(function(err, user) { 
    if (err) throw err; 
//fill userrecipes 
    Recipes.find().... 
}); 
関連する問題