【问题标题】:How to set _id to db document in Mongoose?如何在 Mongoose 中将 _id 设置为 db 文档?
【发布时间】:2013-11-14 15:57:16
【问题描述】:

我正在尝试通过计算数据库中的文档来为我的 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' }

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

【问题讨论】:

    标签: javascript node.js mongodb mongoose


    【解决方案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 });
    

    【讨论】:

    • 即使在我的 db.collection.getIndexes() `_id : 1` 中执行此操作后,仍会显示。这是正确的行为吗?
    • @SarasArya 是的,MongoDB 总是为_id 创建一个索引,不管它的类型如何(参见here)。
    【解决方案2】:

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

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

    这对我有用

    【讨论】:

    • 此选项仅适用于子文档,不适用于标准文档。
    【解决方案3】:

    在 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-27
      • 2019-12-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多