为什么 mongo 中的新文档有一个对象而不是一个 ObjectId

Why new documents in mongo have an object and not an ObjectId?

本文关键字:ObjectId 一个 一个对象 新文档 mongo 为什么 文档      更新时间:2023-09-26

在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'
    }]
});

这就是 ObjectID。它只是一个包含这些属性的对象。

http://docs.mongodb.org/manual/reference/object-id/

ObjectId 是一个 12 字节的 BSON 类型,使用以下方法构造:

  • 一个 4 字节的值,表示自 Unix 纪元以来的秒数,
  • 一个 3 字节的机器标识符,
  • 一个 2 字节的进程 ID,以及
  • 一个 3 字节计数器,从随机值开始。
{
    "_bsontype" : "ObjectID",
    "id" : "U'u0013[-Ф~'u001d$©t",
    "generationTime" : 1.43439e+09
}

U'u0013[-Ф~'u001d$©t是 12 个字符的二进制字符串,当对象作为一个整体表示为文本值(即调用其.toString函数)时,它会转换为熟悉的 24 个字符的十六进制字符串 (55107edd8e21f20000fd79a6

在 Mongoose 中,文档还有一个.id getter,它为您提供 24 个字符的十六进制作为字符串值。

格式

错误的 ObjectId 是由与 mongoose-q 使用的猫鼬版本冲突引起的。您需要将猫鼬-q 更新到版本 0.1.0。我之前使用 0.0.17,并且看到了与您在此处看到的完全相同的行为。

我在这里遇到了同样的问题:对象ID不存储十六进制值

这绝对是环境的问题,也是MongoDB的brew安装的奇怪之处。我发现从brew卸载并手动重新安装解决了我的问题。http://docs.mongodb.org/manual/tutorial/install-mongodb-on-os-x/

虽然我没有从代码/技术角度弄清楚为什么它返回 12 字节 BSON ObjectID 而不是十六进制 ObjectID......从brew中卸载MongoDB并手动重新安装解决了这个问题。