Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 猫鼬承诺链无法删除许多_Mongodb_Mongoose_Mongodb Query - Fatal编程技术网

Mongodb 猫鼬承诺链无法删除许多

Mongodb 猫鼬承诺链无法删除许多,mongodb,mongoose,mongodb-query,Mongodb,Mongoose,Mongodb Query,出于某种原因,我的承诺与猫鼬的联系不起作用。 第二次运行它很有效。我很好奇我做错了什么。 下面是重新创建它的代码 模式 var blogSchema = new mongoose.Schema({ title: String, tag:[{ type: mongoose.Schema.Types.ObjectId, ref: "tag" }]}); var tagSchema = new mongoose.Schema({ tag: String, blog: [{ t

出于某种原因,我的承诺与猫鼬的联系不起作用。 第二次运行它很有效。我很好奇我做错了什么。 下面是重新创建它的代码

模式

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个blog和2个标记,其中引用了blog的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(() => {});
代码的目标是从两个标记中删除blog objectid引用,如果blog objectid中有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的原因,即使两个标记中都有0个blog objectid元素,标记也没有被删除

但是,第二次运行相同的代码成功地删除了这两个标记

我哪里出错了?很明显,我要么是逻辑错误,要么是误解了承诺的作用?任何见解都会有所帮助。谢谢你做你想做的事

这应该起作用:

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()
    }) 

我不确定,但试着把“return”放在Tag.updatemanyys之前,这样就解决了这个问题。非常感谢,这真的帮助我更好地理解了承诺是如何起作用的。