【问题标题】:Mongoose nested schema猫鼬嵌套模式
【发布时间】:2019-03-22 17:49:03
【问题描述】:

我想制作一个主题系统。每个主题都可能有子主题,这些子主题也是主题。 这意味着子主题也可能有子主题。 例如 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;

另外,我发送到服务器的数据应该是什么样子才能创建一个新实例? 在服务器上如何保存?

我现在尝试像这样保存: 常量主题 = 新主题();

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

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案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,您可以按照上述步骤获取结果。

    希望这会对你有所帮助。

    【讨论】:

    • 谢谢,如果我想拥有无限的子主题,这意味着客户可以发送带有子主题的东西有更多的子主题。我想在文件夹系统中制作类似的东西,所以文件夹>子文件夹>子文件夹......并且每个子文件夹都可以有子文件夹。像一棵树
    • 是的,这可以通过这种方法实现。
    • 比如你有 MaiTopic>SubTopic>SuperSubTopic>NSuperSubTopic。这里 NSuperSubTopic 将 SuperSubTopic 作为其 MainTopic,因此您将首先保存 NSuperSubTopic,然后将该 ID 传递到 SuperSubTopic 数组中。希望你能以同样的方式让我看到 SubTopic 是 SuperSubTopic 的 MainTopic 等等......
    • 谢谢。最后使用递归函数将它们链接到链上。
    【解决方案2】:

    您可以通过查看文档的子文档来执行此操作。

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

    【讨论】:

    • 感谢您的回答,我在询问之前尝试从文档中找出答案:) 没有找到一种方法来嵌套架构本身以创建某种类似 Folder>subfolder>subfolder> 和等等……
    猜你喜欢
    • 2014-06-22
    • 2015-09-21
    • 2021-06-07
    • 1970-01-01
    • 2018-06-23
    • 2019-01-16
    • 2017-01-28
    • 2019-07-20
    • 2017-06-12
    相关资源
    最近更新 更多