Как удалить много реляционных документов в MongoDB? - PullRequest
1 голос
/ 05 апреля 2020

Коллекция сообщений

 Post : 
    _id : 001,
    comments : [1,2,3] // ObjectId

Коллекция комментариев

 Comment: 
    { _id : 1, message : "Bar" },
    { _id : 2, message : "Foo" },
    { _id : 3, message : "Bazz" }

Я хочу удалить сообщение и все комментарии к этому сообщению. Но как удалить все свои комментарии?

Обновление


PostSchema
{
    model: String,
    stock: Number,
    images: [String],
    price: Number,
    views: { type: Number, default: 1 },
    commentsCount: { type: Number, default: 0 },
    comments: [{ type: Schema.Types.ObjectId, ref: "postComments" }],
    postedBy: { type: String, ref: "publisherInfo" }
  },

Схема postComments

{
    sender: String,
    createAt: { type: Date, default: Date.now },
    votes: { type: Number, default: 0 },
    contain: String
  },

Ответы [ 2 ]

2 голосов
/ 05 апреля 2020

Вы можете использовать findByIdAndDelete, который удалит документ и вернет его. Теперь мы можем динамически создать массив идентификаторов комментариев и использовать его с операторами deleteMany и $ in. Таким образом, мы просто использовали доступ в два дБ.

router.delete("/posts/:id", async (req, res) => {
  try {
    const result = await Post.findByIdAndDelete(req.params.id);

    let commentIds = result.comments.map((c) => c._id);

    await Comment.deleteMany({
      _id: {
        $in: commentIds,
      },
    });

    res.send("OK");
  } catch (err) {
    console.log(err);
    res.status(500).send("Something went wrong");
  }
});

Если сообщение успешно удалено, но комментарии не могут быть удалены по какой-либо технической причине, вы можете рассмотреть возможность использования транзакций , чтобы обе операции успешно или неудачно.

0 голосов
/ 05 апреля 2020

Таким образом, вы можете быть в безопасности при запросе и удалить все комментарии. Удалите ObjectId(id), если у вас уже есть идентификатор в ObjectId форме

const Posts = db.collection('posts')
const Comments = db.collection('collection')
const postToBeDeleted = await Posts.findOne({_id: ObjectId('posts')})
if(postToBeDeleted){
    await Posts.deleteOne({_id: ObjectId('posts')}
    for(const comment of postToBeDeleted.comments)
        await Comments.deleteOne({_id: ObjectId(comment)})
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...