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