如何在 Mongoose 中将 _id 设置为 db 文档?
Posted
技术标签:
【中文标题】如何在 Mongoose 中将 _id 设置为 db 文档?【英文标题】:How to set _id to db document in Mongoose? 【发布时间】: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'
如果你知道发生了什么,请告诉我。
【问题讨论】:
【参考方案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();
【讨论】:
以上是关于如何在 Mongoose 中将 _id 设置为 db 文档?的主要内容,如果未能解决你的问题,请参考以下文章
mongoose 和 typescript 如何自动将 '_id' 转换为 'id'?
在 mongoose 4.6.0 中将字符串转换为 ObjectId 失败