Node.js Mongoose를 사용하여 문서를 어떻게 제거합니까?


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

위의 방법으로 작동하지 않는 것 같습니다. 기록은 여전히 ​​존재합니다.

누군가 고칠 수 있습니까?

답변:


489

당신이 반복하는 기분하지 않는 경우, 시도 FBFriendModel.find({ id:333 }).remove( callback );또는FBFriendModel.find({ id:333 }).remove().exec();

mongoose.model.find반환 쿼리 가지고, remove기능 .

Mongoose v5.5.3 업데이트- remove()더 이상 사용되지 않습니다. 사용 deleteOne(), deleteMany()또는findOneAndDelete() instead.


3
이 사전 / 사후 제거 미들웨어를 실행합니까? (일부 모델 방법은 문서 미들웨어를 우회하고 이것이 문서 중 하나인지 확실하지 않습니다.)
hunterloftis

12
@hunterloftis가 이미 이것을 알아 냈지만 대답을 읽는 다른 사람이 아니오 인 경우 개별 문서에서 사전 / 사후 미들웨어를 실행하지 않습니다.
numbers1311407

이것은 다른 많은 답변에서 언급 한 것처럼 보이지만 .exec()전혀 그렇지 않습니다. 되어 .exec()필요한, 그것을 사용 여부에이 부작용은?
DanH

문서는 미들웨어를 우회한다는 것이 분명합니다 (아마도 업데이트되었습니다). mongoosejs.com/docs/middleware.html 의 하단을 참조하십시오. 이 방법을 사용하면 심각하고 추적하기 어려운 문제가 발생할 수 있습니다.
Jed Watson

1
좋은 답변입니다! 콜백의 주장은 무엇입니까?
k88074

299

업데이트 : 몽구스 버전 (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

자세한 내용은 몽구스 API 문서 를 참조하십시오 .


13
다른 답변에 대한 다른 의견에서 언급했듯이 이는 스키마에 정의되어 있으며 실제로 위험 할 수있는 미들웨어를 무시합니다. 따라서 영향을 이해 한 경우에만 사용하십시오. 자세한 내용은 mongoosejs.com/docs/middleware.html을
Jed Watson

2
기록을 위해, 지금까지 나는 항상 부작용없이 그것들을 사용했습니다. 물론, 나는 프로젝트에서 미들웨어를 사용하지 않았습니다 :)
diosney

8
remove(query)실수로 통과하면 전체 컬렉션을 비울 수 있습니다query = {} . 따라서 하나의 문서 findOneAndRemove(query)만 제거하는 것이 좋습니다.
joeytwiddle

1
또한 이것은 쿼리를 반환하지 않으므로 약속도 아닙니다. 당신은 할 수Model.remove({ _id: 'whatever' }).exec().then(...)
데이비드

48

docs문서의 배열입니다. mongooseModel.remove()방법 이 없습니다 .

배열의 각 문서를 개별적으로 반복하고 제거 할 수 있습니다.

또는- findOne대신 (아마도) 고유 ID로 문서를 찾는 것처럼 보이기 때문 입니다 find.


5
이 답변이 다소 오래된 몽구스 버전이라고 가정 할 때, 나는 정말로 수락 된 답변을 변경하는 누군가에게 반대하지 않을 것입니다.
mtkopone

이것은 실제로 스키마에 정의 된 미들웨어를 올바르게 호출하기 때문에이를 수행하는 가장 좋은 방법 중 하나입니다 ( mongoosejs.com/docs/middleware.html 참조) . 응용 프로그램에서 미들웨어를 사용하지 않는 경우에만 다른 방법을 사용해야합니다.
Jed Watson

41

이것은 나를 위해 버전 3.8.1에서 최고입니다.

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

그리고 하나의 DB 호출 만 필요합니다. remove검색 및 제거에 대한 조치를 수행하지 않을 경우이를 사용하십시오 .


1
pre 'remove'작업 을 수행 할 필요가없는 한 제대로 작동합니다.
Daniel Kmak

32

간단히

FBFriendModel.remove().exec();

1
간단하고 효과적입니다.
Rich Apodaca 2016 년

1
약속이 반환됩니까? 그렇다면 약속이 해결 될 때 어떤 개체가 정의됩니까?
Kenny Worden

@KennyWorden은 대답-> mongoosejs.com/docs/api.html 을 찾는 효과적인 접근 방식을 찾고 원하는 것을 검색하지만 '#save'에 대한 검색과 같은 브라우저를 사용하여 인 페이지 검색 앞에 '#'를 추가하면 약속을 돌려주는 것을 볼 수 있습니다.
Jason Sebring 2016

3
이것은 제거에 지정된 조건을 넣지 않고 위험한 답변입니다 ...
blak3r

29

mongoose.model.find()함수가있는 쿼리 개체 를 반환 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();

22

remove()더 이상 사용되지 않습니다. 사용 deleteOne(), deleteMany()또는bulkWrite() .

내가 사용하는 코드

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

1
이 답변에는 정직하게 더 많은 투표가 필요합니다. 부당하게 투표권을 얻지 못했기 때문에 불완전하게 배럴의 바닥에 배치되었지만 다음과 같은 문제를 해결하는 유일한 해답입니다.(node:9132) DeprecationWarning: collection.remove is deprecated. Use deleteOne, deleteMany, or bulkWrite instead.
Steven Ventimiglia

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

18

findOne에주의하고 제거하십시오!

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

위의 코드 는 첫 번째 사용자 대신 'Alice'라는 모든 사용자를 제거합니다 .

그건 그렇고, 나는 다음과 같은 문서를 제거하는 것을 선호합니다 :

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

또는 콜백을 제공하고 exec ()를 생략하십시오.

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


12

제거 할 객체를 하나만 찾고 있다면

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

    });

이 예에서 Mongoose는 일치하는 req.params.id를 기반으로 삭제합니다.


Stackoverflow에 오신 것을 환영합니다. 귀하의 답변은이 스레드에서 여러 답변의 복제본입니다. 또한 콜백에서 항상 오류를 확인해야합니다.
VtoCorleone

9

.remove()다음과 같이 작동합니다 .find().

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

9

나는 약속 표기법을 선호합니다.

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

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의 응답을 기다리지 않고 문서를 제거하려면 콜백을 전달하지 않으면 반환 된 쿼리에서 exec를 호출해야합니다.

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

6

제거 기능 내에서 직접 쿼리를 사용할 수 있으므로 다음을 수행하십시오.

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

6

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

5

최신 정보: .remove() 감가 상각되었지만 여전히 이전 버전에서 작동합니다.

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

Model.remove는 사용되지 않습니다
Maxwell sc

2

remove () 메소드를 사용하면 제거 할 수 있습니다.

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

Model.remove는 사용되지 않습니다
Maxwell sc

1
Maxwell sc에서 편집 요청을 한 후 수정하십시오. 나는 당신이 SO를 처음 사용한다는 것을 알고 있지만 감가 상각되었다고 언급하는 것보다 수정하는 것이 더 도움이됩니다. 다음 번에 편집을 제안하거나 직접 편집하고 상황을 약간만 잡을 수 있습니다.
Joshua Michael Wagoner

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

Model.remove더 이상 사용되지 않음
Maxwell sc

1

Samyak Jain의 답변에 따라 Async Await를 사용합니다.

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

0

async / await 가능 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)
}))

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.