【问题标题】:mongoose remove empty objects or arrays猫鼬删除空对象或数组
【发布时间】:2016-01-03 22:07:28
【问题描述】:

我有一个对象,它的字段在保存时有时为空。我最初的想法是在预保存时删除空字段,但由于某种原因,这似乎不起作用。对象值保存后仍然存在。

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

【问题讨论】:

  • 你能显示你的架构吗?
  • 可以删除数据对象的属性,但是Schema是具体的。所有未定义的属性都将由 mongoose 保存为默认值(空、null、'')。

标签: node.js mongodb mongoose


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 2021-08-23
    • 1970-01-01
    • 2021-12-18
    • 2017-03-28
    • 1970-01-01
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多