web-dev-qa-db-fra.com

trouver par _id avec Mongoose

J'ai des problèmes avec un simple findById avec mangouste.

Confirmé que l'article existe dans la base de données

db.getCollection('stories').find({_id:'572f16439c0d3ffe0bc084a4'})

Avec la mangouste

  Story.findById(topic.storyId, function(err, res) {
    logger.info("res", res);
    assert.isNotNull(res);
  });

ne le trouvera pas.

J'ai aussi essayé de me convertir en mongoId, on ne peut toujours pas le trouver (même si soi-disant mangouste le fait pour vous)

var mid = mongoose.Types.ObjectId(storyId);
let story = await Story.findOne({_id: mid}).exec();

En fait, j'essaie de l'utiliser avec TypeScript, d'où l'attente.

J'ai aussi essayé la méthode Story.findById(id), toujours introuvable.

Existe-t-il un moyen simple de rechercher des éléments dans un champ _id simple? Le _id doit-il obligatoirement figurer dans le schéma? (les docs disent non)

Je peux trouver d'autres valeurs dans le schéma, mais _id ne peut pas être utilisé ...


mise à jour: j'ai écrit un court test pour cela.

describe("StoryConvert", function() {


  it("should read a list of topics", async function test() {
    let topics = await Topic.find({});

    for (let i = 0; i < topics.length; i ++) {
      let topic = topics[i];
    // topics.forEach( async function(topic) {
      let storyId = topic.storyId;
      let mid = mongoose.Types.ObjectId(storyId);
      let story = await Story.findOne({_id: mid});
      // let story = await Story.findById(topic.storyId).exec();
      // assert.equal(topic.storyId, story._id);
      logger.info("storyId", storyId);
      logger.info("mid", mid);
      logger.info("story", story);
      Story.findOne({_id: storyId}, function(err, res) {
        if (err) {
          logger.error(err);
        } else {
          logger.info("no error");
        }
        logger.info("res1", res);
      });

      Story.findOne({_id: mid}, function(err, res) {
        logger.info("res2", res);
      });

      Story.findById(mid, function(err, res) {
        logger.info("res3", res);
        // assert.isNotNull(res);
      });

    }

  });


});

Il va retourner des choses comme

Testing storyId 572f16439c0d3ffe0bc084a4

Testing mid 572f16439c0d3ffe0bc084a4

Testing story null

Testing no error

Testing res1 null

Testing res2 null

Testing res3 null

J'ai remarqué que topic.storyId est une chaîne Je ne sais pas si cela causerait des problèmes de mappage vers l'autre table .

  storyId: {
    type: mongoose.Schema.Types.ObjectId,
    required: false
  }

 enter image description here

7
dcsan

Parce que cette requête trouve le document dans le shell:

db.getCollection('stories').find({_id:'572f16439c0d3ffe0bc084a4'})

Cela signifie que le type de _id dans le document est en fait une chaîne et non une ObjectId comme celle attendue par Mongoose.

Pour trouver ce document en utilisant Mongoose, vous devez définir _id dans le schéma pour Story en tant que:

_id: { type: String }
5
JohnnyHK