猫鼬承诺链无法删除很多

时间:2018-11-30 11:34:41

标签: mongodb mongoose mongodb-query

由于某种原因,我与猫鼬的Promise链接无法正常工作。 再次运行它是可行的。我很好奇我做错了什么。 这是重新创建它的代码。

模式

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个带有引用对象ID的标记。

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(() => {});

该代码的目标是从两个标签中删除博客对象ID引用,如果博客对象ID的元素为0,则也删除该标签。

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已执行,但是由于Tag.updateMany,由于某些原因,即使两个Tag中博客objectid的元素为0,也没有删除Tag。

但是,第二次运行相同代码成功删除了两个标签。

我哪里出错了?显然,我必须弄错了逻辑,或者误解了诺言如何运作?任何见解都会有所帮助。谢谢

1 个答案:

答案 0 :(得分:1)

要做你想做的事,either give a callback to exec(), or return the query itself and call 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()
    })