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

Truy vấn các mảng đối tượng lồng nhau

Bạn có thể sử dụng mongoose-mpath gói để tạo phân cấp cây.

Dưới đây là các bước:

1-) Tạo lược đồ danh mục bằng cách sử dụng plugin này.

const mongoose = require("mongoose");
const MpathPlugin = require("mongoose-mpath");

const schema = new mongoose.Schema({
  name: {
    type: String,
    required: true
  }
});

schema.plugin(MpathPlugin);

const Category = mongoose.model("Category", schema);

module.exports = { Category };

2-) tuyến đường đăng để chèn các danh mục với hệ thống phân cấp:

const express = require("express");
const router = express.Router();
const { Category } = require("../models/category");

router.post("/", async (req, res) => {
  const { name, parent } = req.body;

  const category = await Category.create({ name, parent });

  res.status(201).send(category);
});

Sử dụng tuyến đường này, tạo các danh mục với người đưa thư:

Danh mục gốc:(tốt là nên có danh mục ROOT, gốc không có cha)

{
    "name": "ROOT"
}

Phản hồi sẽ như thế này:(như bạn thấy plugin này đã thêm một trường đường dẫn vào nội bộ để duy trì thứ bậc)

{
    "_id": "5dd95adf997fc53e1ce944a7",
    "name": "ROOT",
    "path": "5dd95adf997fc53e1ce944a7",
    "__v": 0
}

Danh mục cat1:(lưu ý rằng chúng tôi đặt trường mẹ thành id danh mục gốc là 5dd95adf997fc53e1ce944a7)

{
    "name": "Cat1",
    "parent": "5dd95adf997fc53e1ce944a7"
}

Kết quả cho Cat1:

{
    "_id": "5dd95b21997fc53e1ce944a8",
    "name": "Cat1",
    "parent": "5dd95adf997fc53e1ce944a7",
    "path": "5dd95adf997fc53e1ce944a7#5dd95b21997fc53e1ce944a8",
    "__v": 0
}

Danh mục Cat11:(lưu ý rằng chúng tôi đặt trường mẹ thành id Cat1 là 5dd95adf997fc53e1ce944a7)

{
    "name": "Cat11",
    "parent": "5dd95adf997fc53e1ce944a7"
}

Kết quả cho Cat11:

{
    "_id": "5dd95b8e997fc53e1ce944aa",
    "name": "Cat11",
    "parent": "5dd95adf997fc53e1ce944a7",
    "path": "5dd95adf997fc53e1ce944a7#5dd95b8e997fc53e1ce944aa",
    "__v": 0
}

Và để tìm danh mục theo tên, bạn có thể sử dụng đường lấy sau:(Tôi đặt tên danh mục được mã hóa cứng để đơn giản, bạn không thể lấy tên danh mục từ req.body hoặc req.query)

router.get("/", async (req, res) => {
  let category = await Category.findOne({
    name: "Cat11" 
  });

  res.status(200).send(category);
});

Thao tác này sẽ trả lại cho bạn tài liệu danh mục Cat11 như sau:

{
    "_id": "5dd95b8e997fc53e1ce944aa",
    "name": "Cat11",
    "parent": "5dd95adf997fc53e1ce944a7",
    "path": "5dd95adf997fc53e1ce944a7#5dd95b8e997fc53e1ce944aa",
    "__v": 0
}

Và nếu bạn muốn lấy các danh mục con của danh mục được tìm thấy, bạn có thể thử mongoose-mpath các phương thức như getChildrenTree.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB Aggregation:Làm thế nào để có được tổng số bản ghi?

  2. Node.js:Tài liệu trả về không xác định - Mongoose

  3. Cách Mocha biết tệp nào cần tải đầu tiên trong bộ thử nghiệm

  4. Lỗi kết nối với Azure:Ký tự không hợp lệ trong mật khẩu với mongoose 5.0.1 nhưng hoạt động trong 4.13.9

  5. Truy vấn C # mongo với chuỗi json