【问题标题】:Why new documents in mongo have an object and not an ObjectId?为什么 mongo 中的新文档有一个对象而不是 ObjectId?
【发布时间】:2015-08-31 08:35:48
【问题描述】:

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

【问题讨论】:

  • 文档中的数据是不是也是这个样子?

标签: javascript mongodb mongoose


【解决方案1】:

就是 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 个字符的 binary 字符串,当对象作为一个整体表示为文本值(即其 @ 987654322@函数被调用)

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

【讨论】:

    【解决方案2】:

    我在这里遇到了同样的问题:ObjectID not storing hexadecimal value

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2022-12-07
        • 2018-02-13
        • 2019-07-27
        • 2012-09-19
        • 2017-06-22
        • 1970-01-01
        • 2014-07-31
        • 2015-03-19
        • 2022-01-13
        相关资源
        最近更新 更多