如何使用Node.js Mongoose删除文档?

时间:2011-04-27 19:57:28

标签: javascript node.js mongodb express authentication

FBFriendModel.find({
    id: 333
}, function (err, docs) {
    docs.remove(); //Remove all the documents that match!
});

以上似乎不起作用。记录仍在那里。

有人能解决吗?

23 个答案:

答案 0 :(得分:462)

如果您不想迭代,请尝试FBFriendModel.find({ id:333 }).remove( callback );FBFriendModel.find({ id:333 }).remove().exec();

mongoose.model.find返回Query,其中包含remove function

答案 1 :(得分:276)

更新:Mongoose版本(5.5.3)

不推荐使用

remove(),而是可以使用deleteOne(),deleteMany()或bulkWrite()。

"mongoose": ">=2.7.1"开始,您可以使用.remove()方法直接删除文档,而不是找到文档然后将其删除,这对我来说更有效,更易于维护。

参见示例:

Model.remove({ _id: req.body.id }, function(err) {
    if (!err) {
            message.type = 'notification!';
    }
    else {
            message.type = 'error';
    }
});

<强>更新

从mongoose 3.8.1开始,有几种方法可以直接删除文档,例如:

  • remove
  • findByIdAndRemove
  • findOneAndRemove

有关详细信息,请参阅mongoose API docs

答案 2 :(得分:46)

docs是一系列文档。所以它没有mongooseModel.remove()方法。

您可以单独迭代并删除阵列中的每个文档。

或者 - 因为看起来您正在通过(可能)唯一身份证件查找文档 - 请使用findOne代替find

答案 3 :(得分:38)

这对我来说是3.8.1版本中最好的:

MyModel.findOneAndRemove({field: 'newValue'}, function(err){...});

它只需要一次数据库调用。 使用此选项表示您不会执行搜索和删除任何remove操作。

答案 4 :(得分:31)

简单地做

FBFriendModel.remove().exec();

答案 5 :(得分:28)

mongoose.model.find()返回Query Object,其中还有remove()个功能。

如果您只想删除一个唯一文档,也可以使用mongoose.model.findOne()

否则,您也可以按照传统方法,首先检索文档,然后删除。

yourModelObj.findById(id, function (err, doc) {
    if (err) {
        // handle error
    }

    doc.remove(callback); //Removes the document
})

以下是model对象的方法,您可以执行以下任何操作来删除文档:

yourModelObj.findOneAndRemove(conditions, options, callback)

yourModelObj.findByIdAndRemove(id, options, callback)

yourModelObj.remove(conditions, callback);

var query = Comment.remove({ _id: id });
query.exec();

答案 6 :(得分:18)

要概括,您可以使用:

SomeModel.find( $where, function(err,docs){
  if (err) return console.log(err);
  if (!docs || !Array.isArray(docs) || docs.length === 0) 
    return console.log('no docs found');
  docs.forEach( function (doc) {
    doc.remove();
  });
});

实现这一目标的另一种方法是:

SomeModel.collection.remove( function (err) {
  if (err) throw err;
  // collection is now empty but not deleted
});

答案 7 :(得分:18)

小心使用findOne并删除!

  User.findOne({name: 'Alice'}).remove().exec();

上面的代码会删除名为“Alice”的所有用户,而不会删除第一个

顺便说一下,我更喜欢删除这样的文档:

  User.remove({...}).exec();

或提供回调并省略exec()

  User.remove({...}, callback);

答案 8 :(得分:14)

model.remove({title:'danish'}, function(err){
    if(err) throw err;
});

参考:http://mongoosejs.com/docs/api.html#model_Model.remove

答案 9 :(得分:12)

remove()已过时。使用deleteOne()deleteMany()bulkWrite()

我使用的代码

TeleBot.deleteMany({chatID: chatID}, function (err, _) {
                if (err) {
                    return console.log(err);
                }
            });

答案 10 :(得分:11)

如果您只想要删除一个对象,可以使用

    private static boolean compare(int[][] a, int i) {
     if (i == a.length - 1) {
      return true;
     } 
     else {
       if (calcLineSum(a[i], 0, 0) == calcLineSum(a[i + 1], 0, 0)){
         compare(a, i + 1);
       }
       else { 
        return false;
       }
     }
     return false; //<= = 'fake'
    }
    private static int calcLineSum(int[] a, int i, int sum) {
     if (i == a.length)
      return sum;
     else {
      sum = sum + a[i];
      calcLineSum(a, i + 1, sum);
     }
     return sum; //<= = 'fake'
    }

在此示例中,Mongoose将根据匹配的req.params.id进行删除。

答案 11 :(得分:9)

.remove()的作用类似于.find()

MyModel.remove({search: criteria}, function() {
    // removed.
});

答案 12 :(得分:7)

我更喜欢承诺符号,例如你需要。

Model.findOneAndRemove({_id:id})
    .then( doc => .... )

答案 13 :(得分:7)

要删除文档,我更喜欢使用Model.remove(conditions, [callback])

请参阅API文档以删除: -

http://mongoosejs.com/docs/api.html#model_Model.remove

对于这种情况,代码将是: -

FBFriendModel.remove({ id : 333 }, function(err, callback){
console.log(‘Do Stuff’);
})

如果要在不等待MongoDB响应的情况下删除文档,请不要传递回调,然后需要在返回的Query上调用exec

var removeQuery = FBFriendModel.remove({id : 333 });
removeQuery.exec();

答案 14 :(得分:6)

您可以直接在remove函数中使用查询,所以:

FBFriendModel.remove({ id: 333}, function(err){});

答案 15 :(得分:4)

更新:.remove()已弃用,但这仍旧适用于旧版本

YourSchema.remove({
    foo: req.params.foo
}, function(err, _) {
    if (err) return res.send(err)
    res.json({
        message: `deleted ${ req.params.foo }`
    })
});

答案 16 :(得分:4)

您可以随时使用Mongoose内置功能:

var id = req.params.friendId; //here you pass the id
    FBFriendModel
   .findByIdAndRemove(id)
   .exec()
   .then(function(doc) {
       return doc;
    }).catch(function(error) {
       throw error;
    });

答案 17 :(得分:2)

使用remove()方法可以删除。

getLogout(data){
        return this.sessionModel
        .remove({session_id: data.sid})
        .exec()
        .then(data =>{
            return "signup successfully"
        })
    }

答案 18 :(得分:1)

这对我有用,试试这个:

const id = req.params.id;
      YourSchema
      .remove({_id: id})
      .exec()
      .then(result => {
        res.status(200).json({
          message: 'deleted',
          request: {
            type: 'POST',
            url: 'http://localhost:3000/yourroutes/'
          }
        })
      })
      .catch(err => {
        res.status(500).json({
          error: err
        })
      });

答案 19 :(得分:1)

根据Samyak Jain的回答,我使用Async Await

let isDelete = await MODEL_NAME.deleteMany({_id:'YOUR_ID', name:'YOUR_NAME'});

答案 20 :(得分:1)

我真的很喜欢async/await capable Express / Mongoose应用程序中的这种模式:

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

<table id="table-container">
  <tbody class="tbody-container">
    <tr id="webUIPage_MPD_Downtime_Pareto_Grd_1_0_0000000001" key="DT_002_001" ** parentkey="" class="WebUIGrid_RowClass" level="0" onmouseover="webUIPage_MPD_Downtime_Pareto_Grd_1.rowOnMouseOver(&quot;webUIPage_MPD_Downtime_Pareto_Grd_1&quot;,&quot;webUIPage_MPD_Downtime_Pareto_Grd_1_0_0000000001&quot;)"
      onmouseout="webUIPage_MPD_Downtime_Pareto_Grd_1.rowOnMouseOut(&quot;webUIPage_MPD_Downtime_Pareto_Grd_1&quot;,&quot;webUIPage_MPD_Downtime_Pareto_Grd_1_0_0000000001&quot;)" onclick="webUIPage_MPD_Downtime_Pareto_Grd_1.rowOnClick(&quot;webUIPage_MPD_Downtime_Pareto_Grd_1&quot;,&quot;webUIPage_MPD_Downtime_Pareto_Grd_1_0_0000000001&quot;)"
      style="background-color: rgb(255, 0, 255); color: black;">

      <td class="WebUIGrid_DataCellClass" align="center">
        <div style="background-color:#AFD8F8;color:#AFD8F8;overflow:hidden;width:20px;height:20px;margin:3px;">AFD8F8</div>
      </td>
      <td class="WebUIGrid_DataCellClass" align="left">Machine not running less than 5 minutes</td>
      <td class="WebUIGrid_DataCellClass" align="right">51</td>
      <td class="WebUIGrid_DataCellClass" align="right">41.7min</td>
    </tr>
  </tbody>
</table>

答案 21 :(得分:0)

db.collection.remove(<query>,
 {
  justOne: <boolean>,
  writeConcern: <document>
})

答案 22 :(得分:0)

要删除单个文档,您可以使用带有 single:true 和 deleteMany() 或 remove() 的 deleteOne() 或 remove() 来删除多个文档:-

  1. 使用 deleteOne()
    syntax
    Model.deleteOne({conditions},function(err){});

    Example
     Model.deleteOne({title:"hi"},function(err){
        if(err)
        {
            res.send(err);
        }
        else{
            res.send("deleted");
        }
    });

2.使用remove()

    syntax
    Model.remove({conditions},{single:true},function(err){});

    Example
     Model.remove({title:"hi"},{single:true},function(err){
        if(err)
        {
            res.send(err);
        }
        else{
            res.send("deleted");
        }
    });

3.使用deleteMany()

syntax
Model.deleteMany({conditions},function(err){});

    Example
     Model.deleteMany({title:"hi"},function(err){
        if(err)
        {
            res.send(err);
        }
        else{
            res.send("deleted");
        }
    });
  1. 使用 remove()
 syntax
    Model.remove({conditions},function(err){});

    Example
     Model.remove({title:"hi"},function(err){
        if(err)
        {
            res.send(err);
        }
        else{
            res.send("deleted");
        }
    });