Подтвердить что ты не робот

Как установить _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' }

Если вы знаете, что происходит, сообщите мне.

4b9b3361

Ответ 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();