Игнорировать нулевые или пустые значения при сохранении типа схемы массива mon goose - PullRequest
0 голосов
/ 26 января 2020

У меня есть следующая схема:

const userSchema = new mongoose.Schema({
    email: [{
        type: String,
        trim: true,
     }]
})

При сохранении нового пользователя,

const user = new User({
    email: ["example@example.com", ""]
    //or email: ["example@example.com", null]
})

try{
   await user.save()
} catch (e) {
   console.log(e)
}

Это сохранит оба этих значения (включая пустую строку и ноль соответственно).

Есть ли способ сохранить только правильное значение электронной почты, отбрасывая пустое или нулевое значение. Вместо этого:

"email" : [ 
        "example@example.com", 
        ""
    ],

хранить только правильный адрес электронной почты:

"email" : [ 
        "example@example.com", 
    ],

В настоящее время для других полей схемы я использую set. Например, в пользовательской схеме выше

url: {
    type: String,
    set: deleteEmpty
}



const deleteEmpty = (v) => {
  if(!v) {
      return undefined
  }

  return v
}

Это, конечно, не сохранит поле url вообще, если значение будет пустым или пустым. Однако, используя этот метод в поле электронной почты выше, вы получите нулевое значение.

Есть ли способ сохранить только правильное значение электронной почты (например, "example@example.com" в этом случае, игнорируя нулевое или пустое значение.)?

Ответы [ 3 ]

0 голосов
/ 26 января 2020

?‍? Я думаю вы можете сделать что-то вроде этого кода ниже ? с вашим userSchema:

userSchema.pre('save', function(next) {
  this.email = this.email.filter(email => email);
  next();
})

Код выше ☝️ будет игрон все empty или null значения в массиве. Вы можете попробовать это.

Или Second Options , вы можете добавить required в поле email в вашем userSchema. Хорошо выглядит этот код ниже: 101

const userSchema = new mongoose.Schema({
  email: [{
      type: String,
      trim: true,
      required: true // add some required
   }],
});

? Код выше ☝️, выдаст вам ошибку , если вы передадите пустую строку в вашем массиве.

Надеюсь, это поможет тебе ?.

0 голосов
/ 27 января 2020

Если у кого-то есть одно или несколько полей, которые принимают значение массива и хотят проверять каждое поле, я рекомендую использовать промежуточное ПО на хуке предварительного сохранения.

supplierSchema.pre('save', normalizeArray)


const normalizeArrray = function(next) {

    //take the list of object feilds and for each field check if it is array
    Object.keys(this.toObject()).forEach((field) => {

        if(Array.isArray(this[field])) {

            //removes null or empty values
            this[field] = this[field].filter(field => field)
        }
    })

    next()
}

Это только основывается на ответе, уже одобренном выше.

0 голосов
/ 26 января 2020

Вы можете сделать следующее, чтобы достичь желаемого.

var arr = ['example@example.com', '']; // variable to keep the an array containing values

var i;
for (i = 0; i < arr.length; i++) {
  if (arr[i] == null || arr[i] == '') {
    arr.slice(i); // remove null or '' value
  }
}

console.log('normalized array: ', arr);
// schema code
const user = new User({
    email: arr
})

try{
   await user.save()
} catch (e) {
   console.log(e)
}

Удачи, надеюсь, я ответил на ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...