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

时间:2015-06-15 18:12:16

标签: 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 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'
    }]
});

3 个答案:

答案 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并手动重新安装它解决了这个问题。