sql >> データベース >  >> NoSQL >> MongoDB

MongoDBからNode.JsにJSONツリーを作成します

    次のデータ(すでにdbからロードされている)が必要だとします:

    var data = [
      { _id: "MongoDB", children: [] },
      { _id: "Postgres", children: [] },
      { _id: "Databases", children: [ "MongoDB", "Postgres" ] },
      { _id: "Languages", children: [] },
      { _id: "Programming", children: [ "Databases", "Languages" ] },
      { _id: "Books", children: [ "Programming" ] }
    ];
    

    _id以降 は一意である場合、最初のステップでそれを辞書に変換します。ここで、キーはIDです:

    var dct = {};
    for (var i = 0; i < data.length; i++) {
        var doc = data[i];
        dct[doc._id] = doc;
    }
    

    次に、dataをループします もう一度配列して子を設定します:

    for (var i = 0; i < data.length; i++) {
        var doc = data[i];
        var children = doc.children;
        var ref_children = [];
        for (var j = 0; j < children.length; j++) {
            var child = dct[children[j]]; // <-- here's where you need the dictionary
            ref_children.push(child);
        }
        doc.children = ref_children;
    }
    

    そして出来上がり、これで完了です:

    JSON.stringify(data);
    

    編集

    ルート(他のノードの子ではないノード)のみが必要な場合は、最初にそれらを見つける必要があります:

    var get_parent = function(node, docs) {
        for (var i = 0; i < docs.length; i++) {
            var doc = docs[i];
            if (doc.children.indexOf(node) != -1) {
                return doc;
            }
        }
        return null;
    };
    
    var roots = [];
    for (var i = 0; i < docs.length; i++) {
        var doc = data[i];
        if (get_parent(doc, docs) === null) {
            roots.push(doc);
        }
    }
    JSON.stringify(roots);
    

    より効率的な方法は、子を間接参照するときに親を格納することです(EDITの上のコードと比較してください):

    for (var i = 0; i < data.length; i++) {
        var doc = data[i];
        var children = doc.children;
        var ref_children = [];
        for (var j = 0; j < children.length; j++) {
            var child = dct[children[j]]; // <-- here's where you need the dictionary
            child.has_parent = true; // <-- has a parent
            ref_children.push(child);
        }
        doc.children = ref_children;
    }
    
    var roots = [];
    for (var i = 0; i < data.length; i++) {
        var doc = data[i];
        if (!doc.has_parent) {
            roots.push(doc);
        }
    }
    JSON.stringify(roots);
    



    1. Mongooseでドキュメントを更新/アップサートするにはどうすればよいですか?

    2. MongoDBからフェッチされた文字列の配列を反復処理します

    3. SpringDataMongoでのObjectIdの問題を使用したファセット+集計クエリ

    4. 初心者はJSONを取得できません