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

IT技术 javascript node.js mongodb mongoose
2021-02-22 19:50:31

我正在尝试通过计算数据库中的文档并使用该数字来创建 _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' }

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

3个回答

您要么需要将该_id属性声明为架构的一部分(您已将其注释掉),要么使用该_id选项并将其设置为false(您正在使用该id选项,该选项创建了一个虚拟 getter 来_id转换为字符串,但仍创建了一个_idObjectID属性,因此会出现铸造错误)。

所以要么这样:

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 });
@SarasArya 是的,MongoDB 总是为 建立一个索引_id,不管它的类型如何(见这里)。
2021-04-16 19:50:31
即使在我的 db.collection.getIndexes() 中执行此操作后,也会显示 _id : 1 。这是正确的行为吗?
2021-04-26 19:50:31

@robertklep 的第一段代码对我不起作用(mongoose 4),也需要禁用 _id

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

这对我有用

此选项仅适用于子文档,不适用于标准文档。
2021-04-23 19:50:31

在 mongoose 中创建自定义 _id 并将该 id 保存为 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();