Не удалось удалить цепочку Mongoose Promise - PullRequest
0 голосов
/ 30 ноября 2018

Почему-то моя цепочка Promise с Mongoose не работает.Запуск его во второй раз работает.Мне любопытно, что я сделал не так.Вот код, чтобы воссоздать его.

Схема

var blogSchema = new mongoose.Schema({
title: String,   
tag:[{  type: mongoose.Schema.Types.ObjectId,
        ref: "tag" }]});

var tagSchema = new mongoose.Schema({
tag: String,
blog: [{ type: mongoose.Schema.Types.ObjectId,
        ref: "blog" }]})

Создание фиктивных данных.1 блог и 2 тега со ссылкой на объект objectid.

var Blog = require("../models/blog") //create your own ref
var Tag = require("../models/tag") //create your own ref

myBlog = new Blog({title: '1st Post'});
tag1 = new Tag({ tag: 'Tag 1' })
tag2 = new Tag({ tag: 'Tag 2' })

myBlog.tag.push(tag1);
myBlog.tag.push(tag2);
tag1.blog.push(myBlog);
tag2.blog.push(myBlog);

Promise.all([myBlog.save(), tag1.save(), tag2.save()])
        .then(() => {});

Цель кода - удалить ссылку на блог objectid из обоих тегов, и, если в блоге есть 0 элементов objectid, удалить тега также.

let foundBlog
Blog.findOne({ title: '1st Post' })
   .then((blog) => {
       foundBlog = blog;
    })
   .then(() => {
       Tag.updateMany( //remove BlogID from Tags
           { _id: { $in: foundBlog.tag } },
           { $pull: { blog: foundBlog._id.toString() } }).exec()          
    })
    .then(() => { //remove any Tags with 0 BlogID
            Tag.deleteMany({ "blog": { $size: 0 } }).exec()
    })    

Выполнение этого в первый раз не удаляло мои теги.Я полагаю, что Tag.deleteMany выполнен, но по какой-то причине теги не были удалены, хотя в обоих тегах есть 0 элементов блога objectid. Это связано с Tag.updateMany.

Тем не менее, выполнение одного и того же кода во второй разуспешно удалите оба тега.

Где я ошибся?Понятно, что я либо неправильно понял мою логику, либо неправильно понял, как работают обещания?Любые идеи будут полезны.Спасибо

1 Ответ

0 голосов
/ 30 ноября 2018

Чтобы сделать то, что вы хотите, либо отзовется exec(), либо вернет сам запрос и вызовет then.

Это должно работать:

let foundBlog
Blog.findOne({ title: '1st Post' })
   .then((blog) => {
       foundBlog = blog;
    })
   .then(() => {
       return Tag.updateMany( //remove BlogID from Tags
           { _id: { $in: foundBlog.tag } },
           { $pull: { blog: foundBlog._id.toString() } });        
    })
    .then(() => { //remove any Tags with 0 BlogID
            Tag.deleteMany({ "blog": { $size: 0 } }).exec()
    }) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...