mongoose supprimer des objects vides ou des tableaux

J’ai un object dont les champs sont parfois vides lors de la sauvegarde. Ma pensée initiale était de supprimer les champs vides avant la sauvegarde, mais pour une raison quelconque, cela ne semble pas fonctionner. Les valeurs d’object sont toujours présentes après leur enregistrement.

module.exports = function(req, res, next) { var newRecipe = new Recipe(req.body); newRecipe.pre('save', function (next) { var that = this.data; Object.keys(that.data).forEach(function(key) { if(that.data.hasOwnProperty(key)){ if(typeof that.data[key] != 'undefined'){ if (!that.data[key].length){ delete that.data[key]; }; } } }); next(); }); newRecipe.save(function(err, recipe) { if (err) { console.log(err); res.sendStatus(500); } else { res.sendStatus(200); } }); }; 

Voici mon object entrant:

  { notes: [], isHostessGift: false, playbook: {}, location: {}, wine: { ingredient: false, pairing: false }, coupons: [], ingredients: [{ item: 'd' }], categories: { dishType: ["Beverage"], mainIngredient: ["d"] }, directions: [{ step: 'd' }], serves: 9, cookTime: 9, prepTime: 8, headline: 'ccc' } 

Y a-t-il une meilleure approche à cela?

Edit: Travailler à partir de la réponse de chridam pour une raison quelconque, les propriétés héritées passent par la fonction hasOwn Property.

  var hasOwnProperty = Object.prototype.hasOwnProperty; function isPropertyEmpty(obj) { if (obj == null) return true; if (obj.length > 0) return false; if (obj.length === 0) return true; for (var key in obj) { if (hasOwnProperty.call(obj, key)){ console.log(key); } } return true; } module.exports = function(req, res, next) { var newRecipe = new Recipe(req.body); newRecipe.pre('save', function (next) { var doc = this; Object.keys(doc).forEach(function(key) { if (isPropertyEmpty(doc[key])){ // console.log(_.omit(doc, doc[key])); }; }); console.log(doc); next(); }); 

Consoler la doc:

 ssortingctMode selected shardval saveError validationError adhocPaths removing inserting version getters _id populate populated wasPopulated scope activePaths ownerDocument fullPath emitter createdAt sites published featured data _id slug image $__original_save save $__original_save save { image: 'lol.jpg', slug: 'lol', _id: 561522878ff1d2f9ae9b4323, data: { headline: 'lol', prepTime: 22, cookTime: 6, serves: 8, directions: [ [Object] ], categories: { mainIngredient: [Object], dishType: [Object] }, ingredients: [ [Object] ], coupons: [], wine: { pairing: false, ingredient: false }, location: {}, playbook: {}, isHostessGift: false, notes: [] }, featured: false, published: false, sites: [ 'HOL' ], createdAt: Wed Oct 07 2015 09:47:51 GMT-0400 (EDT) } 

J’avais beaucoup de problèmes avec cette solution lorsqu’il y avait des schémas nesteds avec des champs optionnels Array . J’ai résolu ce problème en créant un nouveau type:

 optional_array = type: Mixed validate: validator: (v) -> return v instanceof Array message: '{VALUE} needs to be an array.' 

puis en définissant tous mes champs sur optional_array au lieu de Array .