45

我试图通过计算数据库中的文档来为我的 Mongoose 模型动态创建 _id,并使用该数字创建 _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' }

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

4

4 回答 4

59

您要么需要将该_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 });
于 2013-11-04T03:02:03.343 回答
17

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

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

这对我有用

于 2015-11-10T06:59:32.130 回答
4

在 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();
于 2019-05-13T06:25:18.777 回答
0

在为架构保存新数据时,这对我有用。我在我的项目中使用了下面的确切代码

new User(
    {
      email: thePendingUser.email,
      first_name: first_name || thePendingUser.first_name,
      last_name: last_name || thePendingUser.last_name,
      sdgUser: thePendingUser.sdgUser,
      sdgStatus: "active",
      createdAt: thePendingUser.createdAt,
      _id: thePendingUser._id,
    },
    { _id: thePendingUser._id }
  )
于 2022-01-21T14:38:11.380 回答