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
。