2017-09-17 15 views
0

ユーザーは言語を追加できます。言語は、ユーザケーマで教えるか学習するタイプの配列として格納されます。私は単純に言語に言語を追加することができます。プッシュを使用して[]を行うことはできますが、どうすれば削除できますか?Mongoose - 配列要素からオブジェクトを削除する方法

言語オブジェクトの例

let language = { 
    "code": FR 
    "level": 1 
}; 

UserScema.js

var UserSchema = new Schema({ 

     email: { 
      value: { 
       type: String, 
       lowercase: true, 
       //unique: true, 

      }, 
      token: String, 
      verified: Boolean, 
     }, 
     password: { 
      type: String, 
     }, 

     phone: { 
      countryCode: { 
       type: String, 
       //required:true, 
       unique: true, 
      }, 
      number: { 
       type: String, 
       required: true 
      }, 
      code: String, 
      verified: { 
       type: Boolean, 
       default: false 
      }, 
     }, 

     jwt: String, 

     profile: { 
      username: String, 
      firstname: String, 
      lastname: String, 
      dob: String, 
      level: Number, 
      location: String, 
      image: String, 
      introduction: String, 
     }, 
     languages: { 
      teach: [], 
      learn: [], 
     } 
    }, 
    { 
     timestamps: {createdAt: 'created_at', updatedAt: 'updated_at'} 
    }); 

LanguagesController.js

destroy(req, res) { 

    let id  = req.params.id; 
    let language = { 
     "code": req.body.code, 
     "level": req.body.level 
    }; 
    let type  = req.params.type; 

    User.findOne({'_id': id}, function (err, user) { 

     if (err) { 
      return res.status(404).json({ 

       success: true, 
       status: 404, 
       data: err, 
       message: "User does not exist", 

      }); 
     } 

     if (type === "teach") { 

      for (let i = 0; i < user.languages.teach.length; i++) 
       if (user.languages.teach[i].code === language.code) { 
        user.languages.teach[i].remove(); 
        break; 
       } 

     } 
     if (type === "learn") { 
      //user.languages.learn.push(language); 
     } 

     console.log(user); 

     user.save((err, user) => { 

      return res.status(200).json({ 

       success: true, 
       status: 201, 
       data: user, 
       message: "Successfully Deleted Language", 

      }); 
     }); 

    }); 

} 

私は[user.languages.teachを取得.removeが、イムを使用しようとしましたi] .removeは関数ではありません。

+0

if(type === "teach")の中のforループの代わりに 'user.languages.teach = user.languages.teach.filter(o => o.code!== language.code) ' – RaghavGarg

+0

私はユーザーの入力に応じて言語配列を変更したいので、タイプを使用しているのですが、タイプを操作したい場合は同じコードを使用します。==教授またはタイプ== learn .. – Kay

+0

申し訳ありませんあなたのif条件を取り除くと言っているわけではありませんが、上記のスニペットを使って 'if(type ===" teach ")'の中のforループを削除するように言いました。 – RaghavGarg

答えて

1

はい.removeアレイ上の何物でもありません。 .filterを使用して、不要な配列要素を削除することができます。

次のように使用される:これは上記の条件で配列からすべての要素を除去する

if (type === "teach") { 
    user.languages.teach = user.languages.teach.filter(o => o.code !== language.code) 
} 

続きを読むArray.prototype.filterを参照してください。

+0

サブ文書がより良いアプローチになるかどうか疑問に思っていますか? – Kay

1

たぶん何かのような...

... 
if (type === "teach") { 
    var index = user.lanauges.teach.findIndex(function(item){ 
    return item.code === languge.code; 
    }); 

    user.languages.teach.splice(index, 1); 

    .... 
+0

こんにちは、これは働き、理解しやすくなりました。私はRaghavgargアプローチを使った方がずっと簡単でした。 – Kay

関連する問題