簡體   English   中英

使用 mongoose 節點 JS 獲取 3 個模式值

[英]fetch 3 schema value using mongoose node JS

我有 3 個集合架構 CategorySchema、SubCategorySchema、ProductSchema,如下所示。

var CategorySchema = new mongoose.Schema({  
  catgory_name: {
    type: String,
    required: [true, "Catgory name is required"]
  },  
  modified_date: {
    type: Date
  }
});

module.exports = mongoose.model("Category", CategorySchema);
var SubCategorySchema = new Schema({  
  subcatgory_name: {
    type: String,
    required: [true, "subcategory name is required"]
  },  
  category_id: {
    type: Schema.Types.ObjectId,
    ref: "Category",
    required: [true, "category id is required"]
  },  
  modified_date: {
    type: Date
  },  
  is_active: {
    type: Boolean,
    default: 1
  }
});

module.exports = mongoose.model("SubCategories", SubCategorySchema);

const ProductSchema = new Schema({  
  product_name: {
    type: String,
    required: [true, "Product name is required"]
  },  
  product_image: {
    type: String,
    required: [true, "Product image is required"]
  },  
  category_id: {
    type: Schema.Types.ObjectId,
    ref: "Category",
    required: [true, "category is required"]
  },  
  subcategory_id: {
    type: Schema.Types.ObjectId,
    ref: "Subcategory",
    required: [true, "Subcategory is required"]
  },  
  modified_date: {
    type: Date
  },  
  is_active: {
    type: Boolean,
    default: 1
  }
});

module.exports = mongoose.model("Products", ProductSchema);

在這里,我想獲取所有活動產品(is_active = 1)以及相應的類別和活動子類別(is_active = 1)。 無需檢查類別的 is_active 條件,但需要檢查子類別和產品的活動條件

我在節點 JS 控制器中嘗試了以下代碼

router.get("/list", (req, res, next) => {
  products
    .find({ is_active: true })
    .populate("category_id")
    .populate("subcategory_id", null, SubCategory, {
      match: { is_active: true }
    })
    //.where("subcategory_id", !null)
    .then(products => res.json({ status: 200, data: products }))
    .catch(err => res.json(err));
});

但即使子類別處於非活動狀態,它也會返回產品數據

您可以使用 mongodb 聚合框架仍然使用 mongoose 進行查詢。

router.get("/list", (req, res, next) => {
  products
    .aggregate([
      {
        $match: {
          is_active: true
        }
      },
      {
        $lookup: {
          from: "subcategories",
          localField: "subcategory_id",
          foreignField: "_id",
          as: "subcategories"
        }
      },
      {
        $unwind: "$subcategories"
      },
      {
        $match: {
          "subcategories.is_active": true
        }
      },
      {
        $lookup: {
          from: "categories",
          localField: "category_id",
          foreignField: "_id",
          as: "category"
        }
      },
      {
        $addFields: {
          category: {
            $arrayElemAt: ["$category", 0]
          }
        }
      }
    ])
    .then(products => res.json({ status: 200, data: products }))
    .catch(err => res.status(500).json(err));
});

操場

讓我們有這些示例文檔:

db={
  "products": [
    {
      "modified_date": "2020-01-08T09:06:51.544Z",
      "is_active": true,
      "_id": "5e159ca1bd95457404b22bc3",
      "product_name": "Product1 Name",
      "product_image": "Product1 Image",
      "category_id": "5e159b77a746036404b5f0ae",
      "subcategory_id": "5e159befbd95457404b22bc2"
    },
    {
      "modified_date": "2020-01-08T09:06:51.544Z",
      "is_active": false,
      "_id": "5e159cb8bd95457404b22bc4",
      "product_name": "Product2 Name",
      "product_image": "Product2 Image",
      "category_id": "5e159b77a746036404b5f0ae",
      "subcategory_id": "5e159befbd95457404b22bc2"
    },
    {
      "modified_date": "2020-01-08T09:06:51.544Z",
      "is_active": true,
      "_id": "5e159d3abd95457404b22bc6",
      "product_name": "Product3 Name",
      "product_image": "Product3 Image",
      "category_id": "5e159b77a746036404b5f0ae",
      "subcategory_id": "5e159ce0bd95457404b22bc5"
    }
  ],
  "categories": [
    {
      "modified_date": "2020-01-08T09:04:18.003Z",
      "_id": "5e159b77a746036404b5f0ae",
      "catgory_name": "Main Category 1"
    }
  ],
  "subcategories": [
    {
      "modified_date": "2020-01-08T09:06:51.544Z",
      "is_active": true,
      "_id": "5e159befbd95457404b22bc2",
      "subcatgory_name": "Sub Category 1",
      "category_id": "5e159b77a746036404b5f0ae"
    },
    {
      "modified_date": "2020-01-08T09:06:51.544Z",
      "is_active": false,
      "_id": "5e159ce0bd95457404b22bc5",
      "subcatgory_name": "Sub Category 2",
      "category_id": "5e159b77a746036404b5f0ae"
    }
  ]
}

結果將是:

[
  {
    "_id": "5e159ca1bd95457404b22bc3",
    "category": {
      "_id": "5e159b77a746036404b5f0ae",
      "catgory_name": "Main Category 1",
      "modified_date": "2020-01-08T09:04:18.003Z"
    },
    "category_id": "5e159b77a746036404b5f0ae",
    "is_active": true,
    "modified_date": "2020-01-08T09:06:51.544Z",
    "product_image": "Product1 Image",
    "product_name": "Product1 Name",
    "subcategories": {
      "_id": "5e159befbd95457404b22bc2",
      "category_id": "5e159b77a746036404b5f0ae",
      "is_active": true,
      "modified_date": "2020-01-08T09:06:51.544Z",
      "subcatgory_name": "Sub Category 1"
    },
    "subcategory_id": "5e159befbd95457404b22bc2"
  }
]

如您所見,即使產品 3 處於活動狀態,也未檢索到,因為其子類別5e159ce0bd95457404b22bc5未處於活動狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM