2016-05-20 6 views
5

У меня возникли проблемы с простым findById с мангуста.найти _id с Mongoose

Подтверждено элемент существует в БД

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

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

Я также пробовал метод Story.findById(id), по-прежнему не может быть найден.

Есть ли какие-либо ключи для поиска предметов на равнине _id? ли _id должны быть в схеме? (Не документы говорят, нет)

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


обновление: Я написал небольшой тест для этого.

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

+0

_id создаются по умолчанию Нет необходимости добавлять его в схеме возможности извлечения записей Вы?если это так при использовании _id попытаться скрыть его в toObject(). Я не уверен, дайте ему попробовать !!! –

ответ

3

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

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

Это означает, что тип _id в документе на самом деле является стрингом g, а не ObjectId, как ожидает Mongoose.

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

_id: { type: String } 
+0

Это похоже на правильную ситуацию. Я переношу некоторые данные по всему, что было создано до того, как мы начали использовать mongo, поэтому типы, вероятно, непоследовательны. Я попробую это, спасибо! – dcsan

-1

Попробуйте

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

}); 
+0

нет, ничего не возвращает. – dcsan

+0

любая ошибка или используйте идентификатор id, который существует в вашем db –

0

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

_id: ObjectId("572f16439c0d3ffe0bc084a4") 

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

+0

Это полезная информация, но mongoose действительно сделает это преобразование для вас. –

+0

вопрос в том, как преобразовать строку в ObjectId, правильно? – ana06

+0

Это просто поиск документа по '_id'. В любом случае, mongoose автоматически преобразует его в ObjectId, поэтому вы можете просто предоставить ему строку: '_id:" 572f16439c0d3ffe0bc084a4 "' –

Смежные вопросы