在mongodb中插入新文档时,ID看起来不像ObjectId,而是看起来像对象。
"_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'
}]
});
答案 0 :(得分:2)
是 ObjectID是什么。它只是一个包含这些属性的对象。
http://docs.mongodb.org/manual/reference/object-id/
ObjectId是一个12字节的BSON类型,使用:
构造
- 一个4字节的值,表示自Unix纪元以来的秒数,
- 一个3字节的机器标识符,
- 一个2字节的进程ID,
- 一个3字节的计数器,以随机值开始。
=COUNTA()
{
"_bsontype" : "ObjectID",
"id" : "U\u0013[-Ф~\u001d$©t",
"generationTime" : 1.43439e+09
}
是12个字符二进制字符串,当整个对象表示为文本值时,该字符串将转换为熟悉的24个字符十六进制字符串(U\u0013[-Ф~\u001d$©t
) (即调用其.toString
函数)
在Mongoose中,文档中还有一个55107edd8e21f20000fd79a6
getter,它为您提供24个字符串值作为字符串值。
答案 1 :(得分:1)
格式错误的ObjectId是由与mongoose-q正在使用的猫鼬版本冲突引起的。您需要将mongoose-q更新到版本0.1.0。我之前使用的是0.0.17,看到了与此处看到的完全相同的行为。
答案 2 :(得分:0)
我在这里遇到了同样的问题:ObjectID not storing hexadecimal value
这绝对是环境问题,而且MongoDB的brew安装有些奇怪。我发现从brew中卸载并手动重新安装解决了我的问题。 http://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/
虽然我没有从代码/技术角度弄清楚为什么它返回12-byt BSON ObjectID而不是十六进制ObjectID ...从brew卸载MongoDB并手动重新安装它解决了这个问题。