Отфильтруйте лунные результаты по контрольному полю, используя экспресс - PullRequest
0 голосов
/ 22 мая 2018

Мне нужно отфильтровать товары коллекции по идентификатору категории, который является справочным полем.

product.js

const restful = require('node-restful')
const mongoose = restful.mongoose

const productSchema = new mongoose.Schema({
  name: { type: String, required: true },
  category: {type: mongoose.Schema.Types.ObjectId, ref: 'CategoryProduct'}
})

productSchema.pre('find', function () {
  this.find().populate('category')
})

module.exports = restful.model('product', productSchema)

rout.js

const express = require('express')
const auth = require('./auth')
module.exports = function (server) {
  const protectedApi = express.Router()
  server.use('/api', protectedApi)
  const Product = require('../api/product/productService')
  Product.register(protectedApi, '/products')
}

Если я запускаю это на Postman, http://localhost:3003/api/products/?name__regex=/test/i, я могу получить все продукты, которые содержат 'test' в названии.

Поэтому я пытаюсь получить все продукты определенной категории, выполнив это http://localhost:3003/api/products/?category=5af3ac4372edc6000468d766.Но так как категория является objectID, я получаю эту ошибку:

{
    "message": "Cast to ObjectId failed for value \"5\" at path \"category\" for model \"SimpleProduct\"",
    "name": "CastError",
    "stringValue": "\"5\"",
    "kind": "ObjectId",
    "value": 5,
    "path": "category"
}

Как мне отфильтровать товары по категориям?Я не знаю, как правильно обработать этот параметр и перейти к mongoose


Вот мой файл CategoryProduct.js

const restful = require('node-restful')

const mongoose = restful.mongoose

const categorySchema = new mongoose.Schema({
  name: {type: String, required: 'O campo Categoria é obrigatório'},
  status: {type: Number, required: true},
  updated_at: {type: Date}
})

module.exports = restful.model('CategoryProduct', categorySchema)

1 Ответ

0 голосов
/ 23 мая 2018

на вашем маршруте вам нужно будет сделать следующее:

const mongoose = require('mongoose');
router.get('/', (req, res, next) => {
   const category = req.query.category; // assign the query param for use

   // mongoose query now
   Product.find({category: mongoose.Types.ObjectId(category)}, (err, result) => {
      if (err) {console.log(err)};
      if (result) {
         res.json(result);
      }
   });
});

Это просто базовый пример.Поскольку вы используете node-restful, вам, возможно, придется скорректировать код, но основная идея здесь заключается в том, что вам требуется модуль mongoose, использующий

const mongoose = require('mongoose')

, а затем передайте ему параметр запроса категориичтобы преобразовать строку в objectID, используя:

mongoose.Types.ObjectID(YOUR_CATEGORY_PARAM_HERE)

Вы можете сделать это где угодно, в вашем rout.js или в вашем express.js, просто нужно иметь нужную строкуконвертировать:)

надеюсь, что поможет:).

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