删除mongodb中的数组元素

时间:2016-11-16 14:39:59

标签: javascript node.js mongodb express mongoose

所以我的mongodb看起来像这样:

[
  {
    "_id": "582bc918e3ff1bf021ae8b66",
    "boardName": "Test Board",
    "created_at": 1479264483957,
    "__v": 0,
    "person": [
      {
        "name": "Steve",
        "wins": 1001,
        "losses": 20,
        "_id": "582bc918e3ff1bf021ae8b69"
      },
      {
        "name": "Bobby",
        "wins": 500,
        "losses": 54,
        "_id": "582bc918e3ff1bf021ae8b68"
      },
      {
        "name": "Sarah",
        "wins": 396,
        "losses": 675,
        "_id": "582bc918e3ff1bf021ae8b67"
      }
    ]
  }
]

我希望能够发出删除请求:

/api/scoreBoard/person/:person_id然后它应该删除我数据库中的整个person元素。

例如,如果我删除:

http://localhost:3000/api/scoreBoard/person/582bc918e3ff1bf021ae8b68然后它应该删除" bobby"。之后数据库看起来像这样:

[
  {
    "_id": "582bc918e3ff1bf021ae8b66",
    "boardName": "Test Board",
    "created_at": 1479264483957,
    "__v": 0,
    "person": [
      {
        "name": "Steve",
        "wins": 1001,
        "losses": 20,
        "_id": "582bc918e3ff1bf021ae8b69"
      },
      {
        "name": "Sarah",
        "wins": 396,
        "losses": 675,
        "_id": "582bc918e3ff1bf021ae8b67"
      }
    ]
  }
]

但是如何删除内部人员#34;?我无法让它发挥作用。到目前为止,这是我的代码,它会返回"成功删除的人!"但数据库中没有任何反应。它不会删除任何内容。

app.delete('/api/scoreBoard/person/:person_id', function(req, res) {
  mongoose.model('scoreBoard').findByIdAndRemove(req.params.person_id, function(err) {
    if(!err) {
      res.json('Deleted person successfuly!');
    } else {
      res.write('Delete failed..');
    }
  });
});

3 个答案:

答案 0 :(得分:1)

由于您似乎使用的是Mongoose,我建议您使用refs和单独的Person模型来存储此信息,这看起来像:

记分板:

const mongoose = require('mongoose');
var Schema = mongoose.Schema;

var scoreboardSchema = new Schema({
  boardName: String,
  created_at: Date,
  people: [{type: Schema.Types.ObjectID, ref:"Person"}]
});

人:

const mongoose = require('mongoose');
var Schema = mongoose.Schema;

var personSchema = new Schema({
  name: String,
  wins: Number,
  losses: Number
});

当您想要将用户添加到记分板时,您只需要将他们的ID推送到阵列人员。

然后当你想删除一个人时,你可以使用:

db.Scoreboard.people.pull(req.params.person_id);

如果您沿着这条路走下去,那么当您抓住记分牌时,您需要填充人员,以便看起来像:

Scoreboard.find({}).populate('people').exec(function(err,docs){})

例如。这样可以让您在Person对象上获得更多自由,例如添加更多属性并能够更轻松地编辑它们。

希望这有点帮助。

答案 1 :(得分:0)

您需要使用更新,因为您不想删除整个文档。

这样的事情应该有效。

mongoose.model('scoreBoard')
.update({ 
     _id: <boardID>
},{
    $pull: { person: { _id: <personID}}
}, function(err, result){

});

答案 2 :(得分:0)

app.delete('/api/scoreBoard/person/:person_id', function(req, res) {
  mongoose.model('scoreBoard').findAndUpdate({'person._id':req.params.person_id},{$pull : {person : {_id : req.params.person_id}}}, function(err) {
    if(!err) {
      res.json('Deleted person successfuly!');
    } else {
      res.write('Delete failed..');
    }
  });
});