#node.js #mongodb #express #mongoose #pull
#node.js #mongodb #экспресс #mongoose #тянуть
Вопрос:
Я довольно новичок в mongoose и nodejs, поэтому я делал свой проект, ссылаясь на документ mongoose. Я хочу удалить определенный вложенный документ в массиве комментариев, идентифицировав вложенный документ с его идентификатором. Я попытался сделать это, используя «pull», а также метод «id», как показано на рисунке. Я также не смог найти ни одной ошибки в своем синтаксисе, но все же он работает.
Это образец документа из моей базы данных:
{
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. Я протестировал три метода, он работает нормально, есть ли такая же ошибка в трех методах?