Функция вложенного документа «pull» и «id» не работают в Mongoose

#node.js #mongodb #express #mongoose #pull

#node.js #mongodb #экспресс #mongoose #тянуть

Вопрос:

Я довольно новичок в mongoose и nodejs, поэтому я делал свой проект, ссылаясь на документ mongoose. Я хочу удалить определенный вложенный документ в массиве комментариев, идентифицировав вложенный документ с его идентификатором. Я попытался сделать это, используя «pull», а также метод «id», как показано на рисунке. Я также не смог найти ни одной ошибки в своем синтаксисе, но все же он работает. Изображение моего кода, ошибка в терминале и документе mongoose, на который я ссылаюсь

Это образец документа из моей базы данных:

 {
  comments: [
    {
      replyComment: [],
      _id: 601a673735644c83e0aa1be3,
      username: 'xyz123@gmail.com',
      email: 'xyz123@gmail.com',
      comment: 'test123'
    },
    {
      replyComment: [],
      _id: 601a6c94d1653c618c75ceae,
      username: 'xyz123@gmail.com',
      email: 'xyz123@gmail.com',
      comment: 'reply test'
    },
    {
      replyComment: [],
      _id: 601eb7ba7233015d7090c6bf,
      username: 'xyz123@gmail.com',
      email: 'xyz123@gmail.com',
      comment: 'test comment'
    },
    {
      replyComment: [],
      _id: 601ec090f5f22d75b41bec7b,
      username: 'xyz123@gmail.com',
      email: 'xyz123@gmail.com',
      comment: 'test comment123'
    }
  ],
  _id: 601a3b8038b13e70405cf9ea,
  title: 'latest test',
  snippet: 'latest test snippet',
  body: 'latest test body',
  createdAt: 2021-02-03T05:58:24.123Z,
  updatedAt: 2021-02-07T06:56:53.902Z,
  __v: 15
}
 

Выполнив этот тест, найдите идентификатор («601a3b8038b13e70405cf9ea») и console.log(результат)
Ответ на сделанный запрос

Мой файл topicSchema:

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

const topicSchema = new Schema({
    title: {
        type: String,
        required: true
    },
    snippet: {
        type: String,
        required: true
    },
    body: {
        type: String,
        required: true
    },
    comments: {
        type: Array,
        required: false
    }
}, {timestamps: true},{ versionKey: false });

const Topic = mongoose.model('Topic', topicSchema);
module.exports = Topic;
 

Мой файл commentSchema:

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

const comSchema = new Schema({
    username: {
        type: String,
        required: true
    },
    email: {
        type: String,
        required: true
    },
    comment: {
        type: String,
        required: true
    },
    replyComment: {
        type: Array,
        required: false
    },
}, {timestamps: true},{versionKey: false});

const Comm = mongoose.model('comm', comSchema);
module.exports = Comm;
 

Ответ №1:

Вы не определили topic и не используете topic = result, with , , потому что в этом нет необходимости, поэтому делайте так :

 result.comments.id(commId).remove();
result.save()
 

если вы хотите использовать topic , просто попробуйте

 let topic = resu<
topic.comments.id(commId).remove();
topic.save()
 

для этого документа вы можете использовать update и $pull нравится это:

    Topic.updateOne(
    {
      _id: req.params.id,
    },
    {
      $pull: {
         "comments" : { _id: req.params.id1 } 
      },
    },
  ).then((res)=>{
    console.log(res)
  }).catch(err=>{
    console.log(err)
  });
 

если вы можете использовать async / await, просто попробуйте

 app.delete('/topic/:id/comments/:id1',async(req,res)=>{
  let result = await Topic.findById(req.params.id);
  result.comments.id(req.params.id1).remove();
  let finalResult = await result.save()
  console.log(finalResult)
})
 

и с помощью подхода .then() .catch:

  Topic.findById(res.params.id).then(result=>{
   let topic = resu<
   topic.comments.id(res.params.id1).remove();
   topic.save().then(result=>{
     console.log(result)
   }).catch(err=>console.log(err))
 }
 ).catch(err=>{
  console.log(err)
});
 

ПРИМЕЧАНИЕ: обновите mongodb до версии 4.4, удалите модуль mongoose и установите снова

Комментарии:

1. Спасибо за предложение, но я все еще получаю ту же ошибку.

2. можете ли вы показать мне образец документов

3. да, я отредактировал вопрос, пожалуйста, посмотрите на него там

4. Спасибо, Ясер, я перепробовал все три метода, также входные параметры также корректны, также некоторые другие методы mongoose не работают. Я считаю, что есть проблема с mongoose, но я не уверен.

5. Я протестировал три метода, он работает нормально, есть ли такая же ошибка в трех методах?