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

Posted

技术标签:

【中文标题】如何使用 Node.js Mongoose 删除文档?【英文标题】:How do I remove documents using Node.js Mongoose? 【发布时间】:2011-08-14 03:58:47 【问题描述】:
FBFriendModel.find(
    id: 333
, function (err, docs) 
    docs.remove(); //Remove all the documents that match!
);

上述方法似乎不起作用。记录还在。

有人可以解决吗?

【问题讨论】:

【参考方案1】:

如果您不想迭代,请尝试

FBFriendModel.find( id:333 ).remove( callback );

FBFriendModel.find( id:333 ).remove().exec();

mongoose.model.find 返回一个Query,它有一个remove function。

Mongoose v5.5.3 的更新 - remove() 现已弃用。 使用 deleteOne()deleteMany()findOneAndDelete() instead.

【讨论】:

这是在删除中间件之前/之后运行吗? (一些模型方法绕过了文档中间件,我不确定这是否是其中之一,文档不清楚) 我想@hunterloftis 已经知道了这一点,但对于其他阅读答案是否定的人来说,这不会在单个文档上运行前/后中间件。 这似乎很多其他答案都提到了.exec(),但这根本没有。是否需要.exec(),使用有没有副作用? 文档很清楚(也许它们已经更新),这绕过了中间件 - 请参阅mongoosejs.com/docs/middleware.html 的底部 - 所以要小心,使用这种方法可能会导致严重的、难以追踪的问题。 很好的答案!回调的参数是什么?【参考方案2】:

更新:猫鼬版本 (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 了解更多信息。

【讨论】:

正如其他 cmets 对其他答案所指出的那样,这绕过了在架构上定义的中间件,并且可能非常危险。因此,只有在您了解将产生的影响时才使用它。有关详细信息,请参阅mongoosejs.com/docs/middleware.html 只是为了记录,直到现在我一直使用它们没有任何副作用,当然,我没有在我的项目中使用任何中间件:) 如果您不小心传递了query = remove(query) 可能会清空您的整个收藏。因此,如果我只删除 一个 文档,我更喜欢 findOneAndRemove(query) 另请注意,这不是返回查询,因此也不是承诺。你不能Model.remove( _id: 'whatever' ).exec().then(...)【参考方案3】:

docs 是一个文档数组。所以它没有mongooseModel.remove() 方法。

您可以单独迭代和删除数组中的每个文档。

或者 - 因为看起来您是通过(可能)唯一 ID 查找文档 - 使用 findOne 而不是 find

【讨论】:

看到这个答案假设是一个相当旧的猫鼬版本,我真的不反对有人改变接受的答案。 这实际上是最好的方法之一,因为它正确地调用了在模式上定义的中间件 - 请参阅mongoosejs.com/docs/middleware.html。如果您的应用程序中没有使用中间件,您应该只使用其他方法,然后谨慎使用。【参考方案4】:

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

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

而且它只需要一个数据库调用。 鉴于您在搜索和删除之前没有执行任何 remove 操作,请使用此选项。

【讨论】:

只要您不需要执行pre 'remove' 操作,它就可以正常工作。【参考方案5】:

remove() 已被弃用。使用deleteOne()deleteMany()bulkWrite()

我使用的代码

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

【讨论】:

这个答案确实需要更多的支持。它被不公平地置于桶底(因为它还没有获得五年过时的选票),但它是解决问题的唯一答案:(node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.【参考方案6】:

简单地做

FBFriendModel.remove().exec();

【讨论】:

这会返回一个 Promise 吗?如果是这样,当 Promise 被解析时,定义了什么对象? @KennyWorden 一种找到答案的有效方法 -> mongoosejs.com/docs/api.html 然后搜索您想要的内容,但使用浏览器在页内搜索前添加“#”,例如搜索“#save”你会看到它返回了一个承诺。 这是一个危险的答案,没有将条件放在删除中指定的操作...【参考方案7】:

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();

【讨论】:

【参考方案8】:

为了概括,您可以使用:

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
);

【讨论】:

【参考方案9】:

小心使用 findOne 并删除!

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

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

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

  User.remove(...).exec();

或者提供回调并省略 exec()

  User.remove(..., callback);

【讨论】:

【参考方案10】:
model.remove(title:'danish', function(err)
    if(err) throw err;
);

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

【讨论】:

【参考方案11】:

如果你只寻找一个要移除的对象,你可以使用

Person.findOne(_id: req.params.id, function (error, person)
        console.log("This object will get deleted " + person);
        person.remove();

    );

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

【讨论】:

欢迎来到 ***。您的答案与此线程中的多个答案重复。此外,您应该始终检查回调中的错误。【参考方案12】:

.remove().find() 类似:

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

【讨论】:

【参考方案13】:

我更喜欢 promise 表示法,例如您需要的地方

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

【讨论】:

【参考方案14】:

对于删除文档,我更喜欢使用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();

【讨论】:

【参考方案15】:

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

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

【讨论】:

【参考方案16】:

您始终可以使用 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】:

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

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

【讨论】:

Model.remove 已弃用【参考方案18】:

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

app.delete('/:idToDelete', asyncHandler(async (req, res) => 
  const deletedItem = await YourModel
    .findByIdAndDelete(req.params.idToDelete) // This method is the nice method for deleting
    .catch(err => res.status(400).send(err.message))

  res.status(200).send(deletedItem)
))

【讨论】:

【参考方案19】:

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

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

【讨论】:

Model.remove 已弃用 Maxwell s.c,然后提出编辑请求,并更正。我知道您是 SO 新手,但修复它比评论它已贬值更有帮助。也许您可以建议下次进行编辑,或者自己进行编辑,并对情况有所掌控......【参考方案20】:

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

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

【讨论】:

【参考方案21】:

这对我有用,试试这个:

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
        )
      );

【讨论】:

Model.remove 已弃用【参考方案22】:

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

    使用 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");
        
    );
    使用 remove()
 syntax
    Model.remove(conditions,function(err));

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

【讨论】:

【参考方案23】:

如果您知道文档的_id,您可以使用findByIdAndDelete(id),这是findOneAndDelete( _id: id ) 的简写。

import Question from '../models/Question';

const deleteQuestion = (questionId: string) => 
    try 
        Question.findByIdAndDelete(questionId);
     catch (e) 
        console.error(e);
    
;

这里questionId 是documentId (_id)

【讨论】:

【参考方案24】:
db.collection.remove(<query>,
 
  justOne: <boolean>,
  writeConcern: <document>
)

【讨论】:

@M.R.:当答案中没有链接时,它怎么可能是仅链接的?另请查看:Low quality posts and code only answers 抱歉误点击。但仍然是低质量。

以上是关于如何使用 Node.js Mongoose 删除文档?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Node.js Express Mongoose 删除列表项

Node JS mongoose 创建博文评论系统

考虑到 Mongoose Node.js 中的引用,如何删除对象?

在 Mongoose (mongodb node.js) 中,如何更新现有值并插入缺失值,而不删除未指定的值?

Node.js / Mongoose上的“VersionError:找不到匹配的文档”错误

如何将 MongoDB 查询从 Node.js 驱动程序格式调整为 Mongoose 格式