Enregistrement d'objets imbriqués dans mangouste

Venant de PHP/MySQL fond, j'ai du mal avec les meilleures pratiques en termes de structuration et de sauver mes données.

Je suis en train de créer une petite application où je peux ajouter des recettes avec de multiples ingrédients. J'ai un tas de pré-rempli ingrédients comme de la graine de données, le schéma qui ressemble à:

var IngredientSchema = new Schema({
    name: {
        type: String,
        trim: true,
        required: true,
        index: {
            unique: true
        }
    },
    created: {
        type: Date,
        default: Date.now
    }
});

var Ingredient = mongoose.model('Ingredient', IngredientSchema);

Une recette actuellement ressemble à ceci:

var RecipeSchema = new Schema({
    name: {
      type: String,
      trim: true
    },
    ingredients: [
      {
        type: Schema.Types.ObjectId,
        ref: 'RecipeIngredient'
      }
    ],
    created: {
      type: Date,
      default: Date.now
    }
});

var Recipe = mongoose.model('Recipe', RecipeSchema);

Enfin, j'ai un RecipeIngredientSchema. Maintenant, c'est là que mon MySQL arrière-plan peut être rampant dans; la raison pour laquelle je l'ai fait de cette façon est parce que je veux le "un à plusieurs" de la relation entre les Recettes et les Ingrédients, mais je veux aussi être capable de spécifier une unité:

var RecipeIngredientSchema = new Schema({
    recipe: {
      type: Schema.Types.ObjectId,
      ref: 'Recipe'
    },
    ingredient: {
      type: Schema.Types.ObjectId,
      ref: 'Ingredient'
    },
    unit: {
      type: Schema.Types.ObjectId,
      ref: 'Unit'
    },
    created: {
      type: Date,
      default: Date.now
    }
});

var RecipeIngredient = mongoose.model('RecipeIngredient', RecipeIngredientSchema);

Ma question vient dans deux parties:

  • Je suis aller sur ce d'une manière sensible en termes de modélisation de données ou suis-je loin?
  • Quel serait le processus d'enregistrement d'une recette avec de multiples ingrédients ressemblent réellement?

Je suis en cours de réflexion suivants:

exports.create = function(req, res) {

  var recipe = new Recipe(req.body);

  recipe.save(function(err, recipe) {
    if (err) {
      return res.jsonp(err);
    } else {

      //Loop ingredients
      if (req.body.ingredients) {
        for(var prop in req.body.ingredients) {
          var recipeIngredient = new RecipeIngredient({
            recipeId: recipe._id,
            ingredientId: mongoose.Types.ObjectId(req.body.ingredients[prop])
          });

          recipeIngredient.save(function(err, recipeIngredient) {
            if (err) {
              return res.jsonp(err);
            } else {
              recipe.recipeIngredients.push(recipeIngredient._id);
              recipe.save(function(err, recipe) {
                return res.jsonp(recipe);
              });
            }
          });
        };
      }
    }
  });
}

J'ai l'impression que c'est compliqué et généralement malce serait apprécier quelques conseils!

source d'informationauteur James