MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Tạo một cây JSON trong Node.Js từ MongoDB

Giả sử rằng bạn phải theo dõi dữ liệu (đã được tải từ 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" ] }
];

Kể từ _id là duy nhất, sau đó ở bước đầu tiên, bạn chuyển nó sang từ điển, trong đó khóa là id:

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

Bây giờ bạn lặp qua data mảng một lần nữa và đặt con:

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

Và thì đấy, bạn đã hoàn thành:

JSON.stringify(data);

CHỈNH SỬA

Nếu bạn chỉ muốn gốc (các nút không phải là nút con của bất kỳ nút nào khác), thì trước tiên bạn phải tìm chúng:

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

Cách hiệu quả hơn sẽ là lưu trữ cha mẹ khi tham khảo ý kiến ​​trẻ em (so sánh với mã EDIT ở trên):

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Cập nhật 2 lược đồ mongoose trong lệnh gọi api

  2. Mongodump có khóa cơ sở dữ liệu không?

  3. MongoDB - không thể sử dụng .explain () để nhận thông tin truy vấn trong mã C #?

  4. MongoDB-as-a-Service ở Canada

  5. MongoDB:Tìm thấy quá nhiều phần tử vị trí (tức là '$') trong đường dẫn