Javascript 为什么mongo中的新文档有一个object而不是ObjectId?
在mongodb中插入新文档时,ID看起来不像ObjectId,而是像一个对象Javascript 为什么mongo中的新文档有一个object而不是ObjectId?,javascript,mongodb,mongoose,Javascript,Mongodb,Mongoose,在mongodb中插入新文档时,ID看起来不像ObjectId,而是像一个对象 "_id" : { "_bsontype" : "ObjectID", "id" : "U\u0013[-Ф~\u001d$©t", "generationTime" : 1.43439e+09 } 预期类型: "_id" : ObjectId("55107edd8e21f20000fd79a6") 我的mongodb版本是3.0.3,这几乎就是代码和模式 var
"_id" : {
"_bsontype" : "ObjectID",
"id" : "U\u0013[-Ф~\u001d$©t",
"generationTime" : 1.43439e+09
}
预期类型:
"_id" : ObjectId("55107edd8e21f20000fd79a6")
我的mongodb版本是3.0.3,这几乎就是代码和模式
var Script = {
run: function() {
return CourseModel.findQ()
.then(function(courses){
return courses.map(worker);
}).catch(function(error){
console.log(error);
});
}
};
function worker(course){
var category = { name: course.name, displayOrder: 0 };
return CategoryModel.createQ(category).then(function() {
course.set('name', undefined);
return course.saveQ();
});
}
module.exports = Script;
var CategorySchema = new Schema({
name: {
type: String,
required: true,
unique: true
},
active: {
type: Boolean,
default: true
},
displayOrder: Number,
updateDate: Date,
subcategories: [{
type: Schema.Types.ObjectId,
ref: 'subcategories'
}]
});
这就是ObjectID。它只是一个包含这些属性的对象
ObjectId是一个12字节的BSON类型,使用以下内容构造:
- 一个4字节的值,表示自Unix纪元以来的秒数
- 一个3字节的机器标识符
- 2字节的进程id,以及
- 以随机值开始的3字节计数器
U\u0013[-з~\u001d$©t
是12个字符的二进制字符串,当对象作为一个整体表示为文本值(即调用其函数)时,该字符串被转换为常见的24个字符的十六进制字符串(55107edd8e21f20000fd79a6
)
在Mongoose中,文档还有一个
.id
getter,它将24字符十六进制作为字符串值提供给您。我在这里遇到了同样的问题:
这肯定是环境问题,而且brew安装MongoDB时有些奇怪。我发现从brew卸载并手动重新安装解决了我的问题
虽然我没有从代码/技术角度理解它返回12 byt BSON ObjectID而不是十六进制ObjectID的原因……但从brew中卸载MongoDB并手动重新安装解决了这个问题。格式错误的ObjectID是由于与mongoose-q使用的mongoose版本冲突造成的。您需要升级日期从mongoose-q到版本0.1.0。我之前使用的是0.0.17,看到的行为与您在这里看到的完全相同。文档中的数据是否也是这样?
{
"_bsontype" : "ObjectID",
"id" : "U\u0013[-Ф~\u001d$©t",
"generationTime" : 1.43439e+09
}