我在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
答案 0 :(得分:2)
不幸的是,您不能跳过拥有该文档的主键,但您可以覆盖主键内容,您可以为每个文档定义自己的主键。
尝试以下架构。
var PlayerSchema = new mongoose.Schema({
_id : { type: Number },
player_name : { type: String },
player_age : { type: Number },
player_country : { type: String },
} );
我已将player_id
替换为_id
。现在您可以控制文档的主键,系统不会为您生成密钥。
有一些插件也可以为您的主键执行autoincremet
。 https://github.com/chevex-archived/mongoose-auto-increment。您也可以尝试这些。
另外,关于你得到的错误:
任何文档都是一个对象,应该包含在curly brackets
内,你不能在同一个文档中定义两个独立的对象。所以你得到了这个错误。
答案 1 :(得分:0)
复制在类似 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。