为什么Mongo会为此字段分配ID?

时间:2016-02-25 19:25:12

标签: node.js mongodb mongoose

为什么Mongo会为某些字段而不是其他字段分配ID?

var mongoose = require ("mongoose");
var mySchema = new mongoose.Schema ({   

// other fields...
分配到此字段的

_id:

packageEdits: [{
    time: Date,
    section: String,
    fields: [String]
}],

但不在这里:

subtitles: {
    path: String,
    fileName: String
},

// other fields...
})

在Mongo中查看时,会为此字段分配一个_id:

"packageEdits" : [
{
    "_id" : ObjectId("44cfedfdf34ca223aa3411aa"),
    "section" : "someSection",
    "time" : ISODate("2016-02-25T19:05:49.055Z"),
    "fields" : [
        "someValue"
    ]
}
],

但不是在这里:

"subtitles" : {
"path" : "/some/path",
"fileName" : "someName"
},

这对查询这些嵌套属性有帮助吗?

2 个答案:

答案 0 :(得分:2)

似乎这些对象属于更大的对象。如果是这种情况,则“字幕”已经具有来自父链的一个或多个级别的唯一标识符。 “packageEdits”也可以使用其父标识符找到。但是,“packageEdits”中有一个对象数组。因此,mongoDb需要通过给它一个id来为所有数组元素设置一个地址。出于几个原因需要这样做,但是我选择的最好的是,如果一个数组由于某种原因而改变你不能依赖索引来给你一个特定的对象,并且通常数组中的每个对象都有相同的键。因此,为了从阵列中可靠地调用特定对象,您需要具有唯一的地址。

答案 1 :(得分:2)

这不是MongoDB,而是{ "_id": false }。如果你不想要它,那么为“packageEdits”分配一个单独的“Schema”并在其上设置// Separate schema var packageEditSchema = new Schema({ time: Date, section: String, fields: [String] },{ "_id": false }); // Main schema var mySchema = new Schema({ // ... other fields packageEdits: [packageEditSchema] }); 选项:

_id

Mongoose认为将一个唯一标识符("fields": [String]字段)分配给模式中直接指定的每个数组元素是一个“好主意”,当然除了显式类型。即{{1}}。

保留标识符有点方便,并且有几个原因,但是如果你确定你真的不想要它,那么只需指定关闭这个猫鼬行为的选项。