получить значение схемы 3, используя mon goose node JS - PullRequest
1 голос
/ 08 января 2020

У меня есть 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 для категорий, но нужно проверять активное состояние для подкатегорий и продуктов

Я пытался использовать приведенный ниже код в node JS controller

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

Но даже подкатегории неактивны возвращает данные о продукте

1 Ответ

1 голос
/ 08 января 2020

Вы можете запросить, используя структуру агрегации mongodb, используя мон goose.

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 не активна.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...