Mongoose数据保存不带_id

b91juud3  于 2022-11-13  发布在  Go
关注(0)|答案(3)|浏览(141)

我在node.js应用程序中使用mongoose。我不希望记录中有_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);
            }
        });

我使用的是mongoose版本3.8.14

0ve6wy6x

0ve6wy6x1#

遗憾的是,您不能跳过为文档设置主键,但可以覆盖主键内容,也可以为每个文档定义自己的主键。
请尝试以下架构以获取相同的。

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。你可以试试这些。
另外,关于您收到的错误:任何文档都是一个对象,应该被 Package 在curly brackets中,你不能在同一个文档中定义两个独立的对象。所以你会得到这个错误。

tnkciper

tnkciper2#

复制Github类似问题评论中给出的答案:
_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
    }]
});

花了我一段时间,但在遇到同样的问题后,我在这里找到了文档。

i2byvkas

i2byvkas3#

而不是写这个

{
    player_id :  { type: Number },
    player_name : { type: String },
...}

写下:

{
    _id :  { type: Number },
    _name : { type: String },
    _age  : { type: Number },
    _country : { type: String }
}

因此_id将是players_id
然后进一步编写如下代码:

var athlete = new Player();
        athlete._id = 1;
        athlete._name = "Vicks";
        athlete._age  = 20;
        athlete._country = "UK";

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

相关问题