Voici mon schéma de mangouste:
{ "_id": "5f56fad10820300de031317f", "title": "Chapter2", "number": 2, }
Voici ma base de données:
{ "_id": "5f56fa47a78fbf03cc32d16d", "title": "Chapter1", "number": 1 }
Je veux trouver un chapitre spécifique du chapitres tableau par son id. Donc, j'ai écrit ce code:
router.get('/:id', async function (req, res) { try { const id = req.params.id await Book.findById(id, function (err, chapter) { res.render('chapter.hbs', { chapter: chapter }) }) } catch (error) { res.redirect('/') } })
Selon l'id du chapitre, je veux ce résultat:
{ "_id": "5f56f8e66a7eee227c1acc0a", "title": "Book1", "author": "Author1", "chapters": [{ "_id": "5f56fa47a78fbf03cc32d16d", "title": "Chapter1", "number": 1 }, { "_id": "5f56fad10820300de031317f", "title": "Chapter2", "number": 2, }] }
ou
const chapterSchema = mongoose.Schema({ title: { type: String }, number: { type: Number } }) const bookSchema = mongoose.Schema({ title: { type: String }, author: { type: String }, chapters: [chapterSchema] }) const Book = mongoose.model('Book', bookSchema) module.exports = Book
Que dois-je faire pour trouver un chapitre spécifique en utilisant son identifiant?
3 Réponses :
Vous recherchez sur Book en utilisant findById de chapitres Id, il ne donnera pas de résultat car il ne s'agit pas de Book Id,
Vous devrez utiliser $ elemMatch
pour cela
Consultez cette Interrogation d'un objet dans le sous-tableau Mongoose pour référence
Pour ce faire, utilisez l ' agrégat fonction.
router.get('/:id', async function (req, res) { try { const id = req.params.id await Books.aggregate([ { $project: { title: 1, author: 1, chapters: { $filter: { input: "$chapters", as: "chapter", cond: { $eq: [ "$$chapter.id", id ] } } } } } ]) } catch (error) { res.redirect('/') } })
Vous pouvez utiliser la fonction aggregate ()
,
$ match
votre condition $ filter
pour obtenir un identifiant de chapitre spécifique $ replaceWith
pour remplacer le chapitre à la racine const id = mongoose.Types.ObjectId(req.params.id); let chapter = await Book.aggregate([ { $match: { "chapters._id": id } }, { $replaceWith: { $arrayElemAt: [ { $filter: { input: "$chapters", cond: { $eq: ["$$this._id", id] } } }, 0 ] } } ]); console.log(chapter);
p>
Merci! Maintenant, je reçois quelque chose. Mais c'est un tableau [{"_id": ObjectId ("5f56fad10820300de031317f"), "number": 2, "title": "Chapter2"}]
. Je veux seulement {"_id": ObjectId ("5f56fad10820300de031317f"), "number": 2, "title": "Chapter2"}
@TahsinAlMahi Y a-t-il quelque chose dans la réponse fournie qui, selon vous, ne répond pas à votre question? Si tel est le cas, veuillez commenter la réponse pour clarifier ce qui doit exactement être traité et ce qui ne l’a pas été. S'il répond effectivement à la question que vous avez posée, veuillez noter Accepter vos réponses < / a> aux questions que vous posez
vous pouvez essayer
wait Book.findOne ({"chapters._id": mongoose.Types.ObjectId (req.params.id)})
@turivishal Cela ne fonctionne pas.
pourquoi je n'ai pas répondu ici? parce que vous n'avez pas fourni ce qui ne fonctionne pas, vous devez montrer ce que vous obtenez et ce que vous n'obtenez pas, nous ne pouvons pas comprendre le problème lorsque vous dites Cela ne fonctionne pas || Cette solution ne fonctionne pas || Pas résolu mon problème . de cette façon, personne ne comprendra votre problème et vous n'obtiendrez aucune réponse appropriée.
Je n'obtiens pas le résultat attendu.
oui, puis répondez-leur avec les détails que je reçois de votre réponse et que je ne suis pas attendu, afin qu'ils puissent vous corriger et vous mettre à jour.
permet de déboguer, obtenez-vous le résultat lorsque vous exécutez ce
wait Book.find ()
? deuxième dans la collection tous les chapitres _id sont des identifiants d'objet?@turivishal après avoir utilisé
wait Book.find (function (err, chapitre) {res.send (chapitre)})
J'obtiens toute la collection sous la forme[{"_id": "5f56f8e66a7eee227c1acc0a", "title": "Book1", "author": "Author1", "chapitres": [{"_id": "5f56fa47a78fbf03cc32d16d", "title": "Chapter1", "number": 1}, {"_id": "5f56fad10820300de031317f", "title": "Chapter2", "number": 2,}]}]
oui, l'identifiant de chaque chapitre est _id.