найти по id с Мангустом

у меня проблемы с простым findById с Мангустом.

подтверждено, что элемент существует в DB

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

С мангуста

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

не найдет.

я тоже пробовал преобразование в mongoId, по-прежнему не может быть найден (хотя Мангуст якобы делает это для вас)

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

я на самом деле пытаюсь использовать это с typescript, поэтому жду.

я тоже пробовал Story.findById(id) метод, по-прежнему невозможно найти.

есть ли некоторые gotcha, чтобы просто найти предметы простым _id поле? должен ли _id быть в схеме? (docs say no)

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


update: я написал короткий тест для этого.

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

    }

  });


});

он вернет такие вещи, как

Testing storyId 572f16439c0d3ffe0bc084a4

Testing mid 572f16439c0d3ffe0bc084a4

Testing story null

Testing no error

Testing res1 null

Testing res2 null

Testing res3 null

я заметил, что topic.storyId - строка не уверен, что это вызовет какие-либо проблемы с сопоставлением с другая таблица. Я также попытался добавить некоторые типы defs

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

enter image description here

3 ответов


потому что этот запрос находит doc в оболочке:

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

это означает, что типа _id в документе фактически строка, а не ObjectId как мангуст ждет.

чтобы найти этот документ с помощью Мангуста, вам нужно будет определить _id в схеме для Story as:

_id: { type: String }

на _id в MongoDB не является строкой, это ObjectId. Вы должны сделать:

_id: ObjectId("572f16439c0d3ffe0bc084a4")

см.https://docs.mongodb.com/v3.0/reference/bson-types/#objectid для получения дополнительной информации о MongoDB ids


попробуй такое

 Story.findOne({_id:"572b19509dac77951ab91a0b"}, function(err, story){
                if (err){
                    console.log("errr",err);
                    //return done(err, null);
                }else{
                    console.log(story);
                }

 });