Así que estoy usando mongoose y mongo atlas. Tengo un solo documento con una estructura de la siguiente manera:
{_id: ObjectId("3u3ui4t432) , name: cat1, items : [ {cat1_item1: "something"}, {cat1_item2: "something"} ]} {_id: ObjectId("3u3uir3bi2) , name: cat2, items : [ {cat2_item1: "something"}, {cat2_item2: "something"} ]}
Actualmente, este punto final recupera el documento completo, solo estoy tratando de acceder a una categoría a la vez en función de un parámetro, ya sea URL o cuerpo.
//this gets the specific document i want, but i would prefer to get that document through something like this. // findOne({ category: req.body.category }) app.post('/targetCategory', async (req, res) => { const categoryName = req.body.category categoryCollection.findOne({ _id: "62b9353730ac42a7d390f5ad" }, (err, data) => { if (err) { console.log(err) } else { res.send(data) console.log(categoryName) } }) })
const mongoose = require('mongoose') const Schema = mongoose.Schema; const categorySchema = Schema({ categories: { } }) module.exports = mongoose.model('categoryCollection', categorySchema)
Básicamente, quiero usar parámetros (?) para acceder solo a una categoría a la vez para minimizar los datos enviados a la interfaz. ¿Cómo hago para usar algo como findOne() con el parámetro categoría 1 o categoría 2, ya que solo quiero la matriz dentro? Estoy usando mongoose, node y express.
modelo
const mongoose = require('mongoose') const Schema = mongoose.Schema; const categorySchema = Schema({ name: String, // items placeholder, modify if required items: String[] }) const Category = mongoose.model('Category', categorySchema) module.exports = Category
el controlador que puedes usar
app.post('/listOne', async (req, res) => { try { const categoryData = await Category.findOne({name: req.body.category}) res.send({category: categoryData}) } catch (e) { console.log(e) } })
otra solución de controlador que sugiero
app.get('/category/:name', async (req, res) => { try { const categoryData = await Category.findOne({name: req.params.name}) res.send({category: categoryData}) } catch (e) { console.log(e) } })
Para encontrar datos únicos en la colección, puede usar esta función o leer esto en los documentos de mongoose https://mongoosejs.com/docs/api.html#model_Model.findOne
// Find one adventure whose `country` is 'Croatia', otherwise `null` await Adventure.findOne({ country: 'Croatia' }).exec(); // using callback Adventure.findOne({ country: 'Croatia' }, function (err, adventure) {}); // select only the adventures name and length await Adventure.findOne({ country: 'Croatia' }, 'name length').exec();
y para obtener el parámetro en express puedes usar esto
app.get('/users/:userId/books/:bookId', (req, res) => { res.send(req.params) })