1
votes

Requête dans un document imbriqué dans mongodb

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?


8 commentaires

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.


3 Réponses :


0
votes

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


0 commentaires

0
votes

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('/')
  }
})


0 commentaires

0
votes

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

Playground

p>


2 commentaires

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