我正在尝试通过计算db中的文档来动态创建我的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' }
如果你知道发生了什么,请告诉我。
答案 0 :(得分:34)
您需要将_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 });
答案 1 :(得分:11)
第一段@ robertklep的代码对我不起作用(猫鼬4),也需要禁用_id
var Post = new mongoose.Schema({
_id: Number,
title: String,
content: String,
tags: [ String ]
}, { _id: false });
这对我有用
答案 2 :(得分:1)
在猫鼬中创建自定义_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();