Как установить _id в db-документ в Mongoose?
Я пытаюсь динамически создавать _id для своих моделей Mongoose, подсчитывая документы в db и используя это число для создания _id (если первый _id равен 0). Тем не менее, я не могу заставить _id установить из моих значений. Здесь мой код:
//Schemas
var Post = new mongoose.Schema({
//_id: Number,
title: String,
content: String,
tags: [ String ]
});
var count = 16;
//Models
var PostModel = mongoose.model( 'Post', Post );
app.post( '/', function( request, response ) {
var post = new PostModel({
_id: count,
title: request.body.title,
content: request.body.content,
tags: request.body.tags
});
post.save( function( err ) {
if( !err ) {
return console.log( 'Post saved');
} else {
console.log( err );
}
});
count++;
return response.send(post);
});
Я попытался установить _id несколькими способами, но это не работает для меня. Вот последняя ошибка:
{ message: 'Cast to ObjectId failed for value "16" at path "_id"',
name: 'CastError',
type: 'ObjectId',
value: 16,
path: '_id' }
Если вы знаете, что происходит, сообщите мне.
Ответы
Ответ 1
Вам либо нужно объявить свойство _id
как часть вашей схемы (вы прокомментировали его), либо использовать параметр _id
и установить его на false
(вы используете опцию id
, который создает виртуальный getter для приведения _id
в строку, но все же создаёт свойство _id
ObjectID, следовательно, вы получаете ошибку кастинга).
Итак, либо это:
var Post = new mongoose.Schema({
_id: Number,
title: String,
content: String,
tags: [ String ]
});
Или это:
var Post = new mongoose.Schema({
title: String,
content: String,
tags: [ String ]
}, { _id: false });
Ответ 2
Первая часть кода @robertklep не работает для меня (mongoose 4), также необходимо отключить _id
var Post = new mongoose.Schema({
_id: Number,
title: String,
content: String,
tags: [ String ]
}, { _id: false });
и это работает для меня
Ответ 3
Создайте пользовательский _id в mongoose и сохраните этот идентификатор как mongo _id. Используйте mongo _id перед сохранением таких документов.
const mongoose = require('mongoose');
const Post = new mongoose.Schema({
title: String,
content: String,
tags: [ String ]
}, { _id: false });
// request body to save
let post = new PostModel({
_id: new mongoose.Types.ObjectId().toHexString(), //5cd5308e695db945d3cc81a9
title: request.body.title,
content: request.body.content,
tags: request.body.tags
});
post.save();