【问题标题】:Mongoose data saving without _id没有 _id 的 Mongoose 数据保存
【发布时间】:2021-05-04 07:53:11
【问题描述】:

我在 node.js 应用程序中使用猫鼬。我不想记录中的 _id 字段。 我正在使用此代码来保存没有 _id 字段的记录。但它给出了错误

文档在保存前必须有一个_id

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var PlayerSchema = new Schema({
    player_id :  { type: Number },
    player_name : { type: String },
    player_age  : { type: Number },
    player_country : { type: String }
}
, { _id: false }
);

var Player =  mongoose.model('Player', PlayerSchema );

        var athlete = new Player();
        athlete.player_id = 1;
        athlete.player_name = "Vicks";
        athlete.player_age  = 20;
        athlete.player_country = "UK";

        athlete.save(function(err) {
            if (err){
                console.log("Error saving in PlayerSchema"+ err);
            }
        });

我使用的是猫鼬版本 3.8.14

【问题讨论】:

  • 你真的需要保存没有_id的数据,还是你不想自己声明?
  • 我不想在记录中保存 _id。我正在生成自己唯一的 player_id。
  • 您可以在 player_id 字段上定义唯一索引以确保唯一性,也可以将您的 player_id 重命名为 _id。无论如何,一个文档在 mongoDB 中必须有一个 _id,您只需将它的创建委托给数据库层。您是否尝试过跳过架构定义中的 { _id: false }

标签: node.js mongoose


【解决方案1】:

不幸的是,您不能跳过为文档设置主键,但您可以覆盖主键内容,您可以为每个文档定义自己的主键。

请尝试以下架构。

var PlayerSchema = new mongoose.Schema({
_id :  { type: Number },
player_name : { type: String },
player_age  : { type: Number },
player_country : { type: String },

} );

我已将您的 player_id 替换为 _id。现在您可以控制文档的主键,系统不会为您生成主键。

有些插件也可以为您的主键执行autoincremethttps://github.com/chevex-archived/mongoose-auto-increment。你也可以试试这些。

另外,关于您遇到的错误: 任何文档都是一个对象,应该包含在curly brackets 中,您不能在同一个文档中定义两个独立的对象。所以你得到了这个错误。

【讨论】:

  • 这是由 Mongo 自动生成的;用 Number 覆盖 mongoose.Types.ObjectId() 类型的属性 _id 将来会给你很多错误。
  • 您能否解释一下采用这种方法我们可能会遇到哪些类型的错误?
  • @MinkeshJain 键冲突,最好让数据库完成它的工作
【解决方案2】:

复制一个类似Github issue comment的答案:

_id 选项的存在是为了防止创建并分配给 文档中的每个子文档。

所以,不是为了这个:

var Schema = mongoose.Schema,
ThingSchema = new Schema({    
   name: String,  
   categories: [{         
      label: {            
         type: String,            
         uppercase: true      
      },      
      value: String
   }]
}, {_id: false});
//   ^^^^^^^^^
// this won't work 

为了这个:

var Schema = mongoose.Schema,
ThingSchema = new Schema({
    name: String,
    categories: [{
       label: {
          type: String,
          uppercase: true
       },
       value: String,
       _id: false // <--- this works
    }]
}); 

花了我一段时间,但在遇到同样的问题后,我发现 文档here.

【讨论】:

    猜你喜欢
    • 2012-03-24
    • 2023-03-11
    • 2019-03-05
    • 2013-09-16
    • 2016-06-30
    • 2014-07-03
    • 1970-01-01
    • 2015-02-09
    • 2021-11-12
    相关资源
    最近更新 更多