найти по 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
  }
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);
                }
 });
 
            