【问题标题】:how to push object ids to another schema如何将对象 ID 推送到另一个模式
【发布时间】:2019-08-29 16:02:11
【问题描述】:

我有这样的架构:

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

现在,在前端,我有一个多重选择,用户可以选择一种或多种不同的音乐流派。

所以当点击提交时,有时我会得到(如果用户只选择了一种类型) - 5cab466ed076761558a76148 或多个 - ['5cab466ed076761558a76148', '5cab4915d076761558a7614a']。

所以,如果用户只选择了一种类型,它是字符串,但如果用户选择了多种,它是数组。

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 循环,有什么方法可以使这段代码更好?

【问题讨论】:

    标签: node.js mongodb express mongoose mongoose-schema


    【解决方案1】:

    您可以使用带有spread operator 的三元组而不是带有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);

    【讨论】:

      【解决方案2】:

      如果你想从代码中删除 for 循环,你应该使用 mongoose insertMany 函数,正如你在其官方文档doc 中看到的那样,你可以将一个数组传递给这个函数,然后它将处理批量创建。

      但是对于您的第一个问题,我认为最好的方法是从客户端集成请求主体,这样您就可以轻松地将字符串制作成一个包含一个元素的数组,我认为这对服务器端代码的一致性会更好.

      【讨论】:

      • 您能提供代码吗?因为我没有在我的音乐模型中保存 insertMany,而是在我的 music.music_genres 子文档中
      猜你喜欢
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2019-07-13
      • 2020-04-17
      • 2018-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多