Javascript 如何在Mongoose中将_id设置为db文档?

Javascript 如何在Mongoose中将_id设置为db文档?,javascript,node.js,mongodb,mongoose,Javascript,Node.js,Mongodb,Mongoose,我正试图通过计算数据库中的文档数量,并使用该数字创建_id(假设第一个_id为0),为我的Mongoose模型动态创建_id。但是,我无法从我的值中设置_id。这是我的密码: //Schemas var Post = new mongoose.Schema({ //_id: Number, title: String, content: String, tags: [ String ] }); var count = 16; //Models var Post

我正试图通过计算数据库中的文档数量,并使用该数字创建_id(假设第一个_id为0),为我的Mongoose模型动态创建_id。但是,我无法从我的值中设置_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' }

如果您知道发生了什么,请告诉我。

您需要将
\u id
属性声明为架构的一部分(您将其注释掉),或者使用
\u id
选项并将其设置为
false
(您使用的是
id
选项,它创建了一个虚拟getter来将
\u id
强制转换为字符串,但仍然创建了一个
\u 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 });

@robertklep的第一段代码对我不起作用(mongoose 4),还需要禁用
\u id

var Post = new mongoose.Schema({
  _id: Number,
  title: String,
  content: String,
  tags: [ String ]
}, { _id: false });

这对我很有用

在mongoose中创建自定义id并将该id保存为MongoID。 在保存这样的文档之前,请使用mongo\u 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();

即使在my db.collection.getIndexes()中执行此操作后,仍会显示“id:1”。这是否正确?@SarasArya是的,MongoDB始终为
\u id
创建索引,而不管其类型如何(请参阅)。此选项仅适用于子文档,而不适用于标准文档。