猫鼬嵌套模式

时间:2018-10-18 00:07:18

标签: javascript node.js mongodb mongoose

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

我尝试创建主题架构并添加一个子主题字段,该字段也将引用主题架构。 似乎无法让我的模式代码正常工作

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;

发送给服务器的数据应该如何构成一个新实例? 在服务器上如何保存?

我现在尝试像这样保存: const topic = new Topic();

topic.name = req.body.name;
topic.sub_topic.name=req.body.sub_topic

我发送的数据是:(json)

{
    "name":"TestMain",
    "sub_topic":[{"name":"TestSub"}]            
}
  

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

function subtopicHandler(topic, sub_topic) {
    Topic.find({
      "name": topic.name
    }, function (err, res) {
      if (err) throw err
      return;
    })

    if (sub_topic == undefined) {
      let ntopic = new Topic();
      ntopic.name = topic.name;
      ntopic.sub_topic == undefined;
      ntopic.save(function (err, result) {
        if (err) console.log('saving err', err)
      });
      return ntopic._id;
    }
    let mainTopic = new Topic();
    mainTopic.name = topic.name;
    sub_topic.forEach(function (sub) {
      mainTopic.sub_topic.push(subtopicHandler(sub, sub.sub_topic));
    })
    var retME;
    mainTopic.save(function (err, result) {
      if (err) {
        console.log('saving err', err)
        throw err;
      }
    });
    return mainTopic._id;

  }

使用此架构:

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

2 个答案:

答案 0 :(得分:1)

如果您要发送以下json

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

根据架构定义和给定的json,您可以按照上述步骤操作以获取结果。

希望这会对您有所帮助。

答案 1 :(得分:0)

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

https://mongoosejs.com/docs/subdocs.html