mongoose删除空的对象或数组

我有一个对象,其中的字段有时候是空的。 我最初的想法是删除保存前的空白字段,但由于某种原因,似乎没有工作。 对象值保存后仍然存在。

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); } }); }; 

这是我的传入对象:

  { 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' } 

有没有更好的方法呢?

编辑:由于某些原因,从chridam的回答工作inheritance属性通过hasOwn属性函数传递。

  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(); }); 

调出文档:

 strictMode 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) } 

当使用可选的Array字段嵌套模式时,我遇到了很多这个解决scheme的问题。 我通过创build一个新types来解决这个问题:

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

然后将所有的字段设置为optional_array而不是Array