mongoose删除空对象或数组

时间:2015-10-06 20:38:23

标签: node.js mongodb 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的答案工作继承属性正在通过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) }

1 个答案:

答案 0 :(得分:2)

当存在具有可选Array字段的嵌套模式时,我遇到了很多此问题的问题。我通过创建一个新类型来解决这个问题:

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

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