使用mongodb

时间:2017-12-11 01:47:31

标签: node.js mongodb

{
    "_id": {
        "$oid": "5a2de0a00d6baa43e8b925d0"
    },
    "name": "test",
    "playList": [
        {
            "url": "https://p.scdn.co/mp3-preview/8aa799e60164f8a1fb311188d9d85ef65d7782c6?cid=ed36a056ee504173a3889b2e55cbd461",
            "artist": "Kenny G",
            "songName": "My Heart Will Go On (Love Theme from \"Titanic\")",
            "_id": {
                "$oid": "5a2de0ad0d6baa43e8b925d1"
            }
        },
        {
            "url": "https://p.scdn.co/mp3-preview/7c49854f18e6dfda6cd97ab5e8bc139d7ca82b7c?cid=ed36a056ee504173a3889b2e55cbd461",
            "artist": "PRODUCE 101",
            "songName": "PICK ME",
            "_id": {
                "$oid": "5a2de13b0d6baa43e8b925d2"
            }
        }
    ],
    "__v": 0
}

我有一个名为channels的数据库,其中每个频道都包含playList,如下所示。我想在单击按钮时删除单个项目。我可以处理onClick事件部分,但我不确定如何实现路由部分。

我知道我从做

之类的事情开始
router.delete(''/channels/:id', function(req, res){

    something here...

})

但是如何访问特定项目(可能具有唯一ID?)并从数据库中删除它?

修改

使用下面的GET

router.get('/channels/:id',
        isLoggedIn,
        function(req, res) {
            channel.findOne({'name':req.params.id},function(err,channeldata){
                if(err || channeldata === null){
                    res.status(404).send({
                        message: 'Channel Not Found',
                        data: []
                    })
                }
                else {
                    res.status(200).json({
                        message: "channel to "+req.params.id+"success",
                        data:channeldata
                    })
                }
            })
    });

我在数据库中获取单个频道的数据。

但由于我对这些内容不熟悉,因此我不确定如何访问playList的每个项目并删除单个数据。

EDIT2

var mongoose = require('mongoose');

var ChannelSchema = new mongoose.Schema({
    name: {type:String,required:true},
    playList: [{
        songName: { type : String },
        artist: { type : String },
        url: { type : String }
    }]
})

module.exports = mongoose.model('Channel',ChannelSchema);

1 个答案:

答案 0 :(得分:1)

您可以尝试以下代码段,其中包含资源集合的DELETECRUD)端点的一部分(即channels):

router.delete('/channels/playlist/song', isLoggedIn, (req, res) => {  

  const channel_id = req.query.channelId;
  const song_id    = req.query.songId;

  // the following query deletes a song form a playlist of a certain channel
  channel.update({_id: ObjectId(channel_id)},{$pull:{playList:{_id:ObjectId(song_id)}}})
    .exec()
    .then(result => {

      // for checking if document was found and deleted
      // mongodb actually returns special object `result`
      //   which has its own certain fields
      res.status(200).send({
        status: "success",
        message: result
      });   

    })
    .catch(error => {
        // here we see if we had any problem with server or db itself
        console.log(error)
        res.status(500).send({
        success: false,
        message: "Something went wrong with DELETE /channels/:id"
      })
    })
});

我假设您知道ObjectId()函数的作用 如果您没有声明它,请声明以下注释 在文件的开头(你require所有的一切)

const mongoose = require('mongoose'); // you must have this
const ObjectId = mongoose.Types.ObjectId; // gets the function

如果这有帮助,或者如果您不理解某事,请告诉我 - 我会进行编辑以便您获得。