2016-07-11 4 views
0

Я пытался выполнить console.log (record._id) все записи в моей коллекции mongodb с использованием Mongoose. Я продолжал получать undefined для каждого из значений _id.get _id with mongoose

Я боролся, пока не натолкнулся на this post. Тогда я использовал console.dir, чтобы найти расположение _id и использовал это в моем console.log:

MySchemaModel.find({}).then(function(records) { 

    records.forEach(function(record) { 

    console.log(record._doc._id); // <-- I added ._doc 
    }); 

}); 

Но это выглядит вниз-вправо Hacky. Есть лучший способ сделать это?

ПРИМЕЧАНИЕ. Это не только то, что влияет на console.log. Я просто держу этот вопрос узким.

+0

Что такое _doc или как сгенерировать этот _doc? –

+0

После использования console.dir (запись) он показал мне, что свойство _id находится в свойстве _doc. Отчасти, мне интересно, почему. –

+0

Вы пробовали record._id; – enRaiser

ответ

1

Если вы хотите настроить/редактировать запись, то вы должны использовать функцию .lean(). Функция .lean() превратит ее в обычный объект JavaScript. Если вы не используете функцию .lean(), тогда каждая запись по-прежнему является документом мангуста, а _id ведет себя по-другому в этом контексте. Так можно использовать как

MySchemaModel.find({}).lean().exec(function(error, records) { 
    records.forEach(function(record) { 
    console.log(record._id); 
    }); 
}); 

N.B: при использовании .exec() затем первый параметр, используемый для ошибки и второй для данных успеха.

+0

У меня все еще была такая же проблема, когда просто добавляла функцию 'exec'. Он не выводил бы _ids, но как только я добавил функцию «lean», тогда это сработало для меня. Все еще кажется, что это должно быть более простым. Weird. –

1

Я предполагаю, что проблема связана с обещанием. Я никогда этого не видел.

MySchemaModel.find({}).then 

Так что просто попробуйте простой вызов .exec с обратным вызовом.

MySchemaModel.find({}).exec(function(records) { 
    records.forEach(function(record) { 
    console.log(record._id); 
    }); 
}); 
+0

Я отключил .then для exec, и получается, что синтаксис «обещание» просто прекрасен, так что это не проблема. используя 'lean()', поскольку упоминания shaishab roy используются для выделения любого дополнительного материала мангуста, поэтому _id затем может регистрироваться. –

0

Проблема в том, что каждая запись все еще является документом мангуста, а _id ведет себя по-другому в этом контексте. Функция .lean() превратит его в обычный объект JavaScript.

MySchemaModel.find({}).lean().then(function(records) { 
    records.forEach(function(record) { 
    console.log(record._id); 
    }); 
}); 
1

Mongoose присваивает каждому из ваших схем виртуальный геттер идентификатор по умолчанию, который возвращает поля бросание документы _id в строку, или в случае ObjectIds, его шестнадцатеричной. Если вы не хотите, чтобы идентификатор getter добавлен в вашу схему, вы можете отключить его передачу этой опции во время построения схемы.

var schema = new Schema({ name: String }); 
var Page = mongoose.model('Page', schema); 
var p = new Page({ name: 'mongodb.org' }); 
console.log(p.id); // '50341373e894ad16347efe01' 
Смежные вопросы