как перенести идентификаторы объекта в другую схему - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть схема, подобная этой:

var MusicSchema = new Schema({
    music_genres:[{
        type:Schema.Types.ObjectId,
        ref:'music_genres',
    }],
    music: {
        type:String,
        required:true,
    },
});

Теперь, во внешнем интерфейсе, у меня есть мульти-выбор, когда пользователь выбирает один или несколько разных music_genres.

, поэтому при нажатии кнопки «Отправить» иногда я получаю (если пользователь выбрал только один жанр) - 5cab466ed076761558a76148 или несколько - ['5cab466ed076761558a76148', '5cab4915d076761558a7614a'].

Итак, если пользователь выбрал только 1 жанр, это строка, но если пользователь выбрал несколько, это массив.
router.post('/',async (req,res)=>{
    const newMusic = new Music();
    if(typeof req.body.music_genres === "string") req.body.music_genres = [req.body.music_genres];

    for(var i in req.body.music_genres) newMusic.music_genres.push(req.body.music_genres[i]);  
    await newMusic.save();

Вопрос: Я ненавижу, когда пишу оператор if и проверяю, является ли он строкой, сделать его массивом.Я также ненавижу за утверждение.Есть ли способ улучшить этот код без цикла if и for?

Ответы [ 2 ]

1 голос
/ 08 апреля 2019

Вы можете использовать троицу с оператором распространения вместо цикла с push()

 router.post('/',async (req,res)=>{
    const newMusic = new Music();
    typeof req.body.music_genres === "string" ? newMusic.music_genres = 
      [req.body.music_genres]: newMusic.music_genres = [...req.body.music_genres];
    await newMusic.save();

Пример

let foo = 'foo';
let arr = ['a', 'b'];
let bar = [];
a = foo;
typeof a == 'string' ? bar = [a] : bar = [...a];
console.log(bar);
0 голосов
/ 08 апреля 2019

Если вы хотите удалить цикл for из кода, вы должны использовать функцию mongoose insertMany, как вы можете видеть в ее официальном документе здесь doc , вы можете передать массив этой функции, тогда он будет обрабатывать массовое создание.

но для вашей первой проблемы, я думаю, что лучший подход - это сделать тело запроса интегрированным со стороны клиента, чтобы вы могли легко сделать строку массивом с одним элементом в нем, я думаю, что это будет лучше для согласованности кода на стороне сервера ,

...