Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/378.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
Javascript 猫鼬嵌套模式_Javascript_Node.js_Mongodb_Mongoose - Fatal编程技术网

Javascript 猫鼬嵌套模式

Javascript 猫鼬嵌套模式,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我想建立一个主题系统。每个主题可能都有子主题,这些子主题也是主题。 这意味着子主题也可能有子主题。 例如 我试图创建一个主题模式,并添加一个副标题字段,该字段也将引用主题模式。 我的架构代码似乎无法实现此功能: const mongoose = require('mongoose'); const TopicSchema = new mongoose.Schema({ name: {type:String,unique:true}, sub_topic:[{type:mong

我想建立一个主题系统。每个主题可能都有子主题,这些子主题也是主题。 这意味着子主题也可能有子主题。 例如

我试图创建一个主题模式,并添加一个副标题字段,该字段也将引用主题模式。 我的架构代码似乎无法实现此功能:

const mongoose = require('mongoose');

const TopicSchema = new mongoose.Schema({
    name: {type:String,unique:true},
    sub_topic:[{type:mongoose.Schema.Types.ObjectId, ref : 'Topic'}] 
});

const Topic =mongoose.model('Topic', TopicSchema);
module.exports = Topic;
另外,要创建新实例,im发送到服务器的数据应该是什么样的? 在服务器上如何保存它

我现在试着这样存钱: const topic=新主题()

im发送的数据是:(json)

更新:使用递归函数完成此操作

使用此模式:

const TopicSchema = new mongoose.Schema({
    name: {type:String,unique:true},
    sub_topic:[{type:mongoose.Schema.Types.ObjectId, ref : 'Topic'}] 
});
和数据发送方式:

{
    "name":"A",
    "sub_topic":[
                    {"name":"C","sub_topic":
                        [
                            {"name":"C1"}
                            ,
                            {"name":"C2"}
                        ]
                    }
                    ,
                    {"name":"B"}
                    ,
                    {"name":"D","sub_topic":
                        [
                            {"name":"D1"}
                            ,
                            {"name":"D2"}
                            ,
                            {"name":"D3"}
                        ]
                    }
                ]            
}
到API端点 这样处理:

let mainTopic = new Topic();
    mainTopic.name = req.body.name;
    subtopicHandler(mainTopic, req.body.sub_topic);
  })

您可以使用子文档执行此操作。请查看文档


如果您发送以下json

const obj = {
    "name":"TestMain",
    "sub_topic":[{"name":"TestSub"}]            
}
那么

根据您的模式定义和给定的json,您可以按照上面的步骤获得结果


希望这能对您有所帮助。

谢谢,如果我想拥有无限的子主题,这意味着客户可以发送更多的子主题。我想在文件夹系统中创建类似的东西,这样文件夹>子文件夹>子文件夹…每个子文件夹都可以有子文件夹。例如,你有MaiTopic>SubTopic>SuperSubTopic>NSuperSubTopic。在这里,NSuperSubTopic将SuperSubTopic作为其主主题,所以您将首先保存NSuperSubTopic,并在SuperSubTopic数组中传递该id。希望你们能以同样的方式理解我,副标题是超级主题的主要主题,等等…谢谢。最后用一个递归函数将它们链接到链上。谢谢你的回答,在询问之前,我试着从文档中找出答案:)没有找到一种方法将架构嵌套在自身中,以创建类似文件夹>子文件夹>子文件夹>等的内容。。。
{
    "name":"A",
    "sub_topic":[
                    {"name":"C","sub_topic":
                        [
                            {"name":"C1"}
                            ,
                            {"name":"C2"}
                        ]
                    }
                    ,
                    {"name":"B"}
                    ,
                    {"name":"D","sub_topic":
                        [
                            {"name":"D1"}
                            ,
                            {"name":"D2"}
                            ,
                            {"name":"D3"}
                        ]
                    }
                ]            
}
let mainTopic = new Topic();
    mainTopic.name = req.body.name;
    subtopicHandler(mainTopic, req.body.sub_topic);
  })
const obj = {
    "name":"TestMain",
    "sub_topic":[{"name":"TestSub"}]            
}
let mainTopic = new Topic();
let subTopic = new Topic();

// assuming for now you have only one sub-topic in array
subTopic.name = obj[0].name;

subTopinc.save(function(err,result)=>{
    if(!err){
        mainTopic.name = obj.name;
        mainTopic.sub_topic = [result._id]
        mainTopic.save(function(err,result){
            console.log(result);
        })
    }
});