为什么Mongo将ID分配给该字段?
问题描述:
为什么Mongo将id分配给某些字段而不是其他字段?为什么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...
})
当蒙戈看,有分配给该领域的_id:
"packageEdits" : [
{
"_id" : ObjectId("44cfedfdf34ca223aa3411aa"),
"section" : "someSection",
"time" : ISODate("2016-02-25T19:05:49.055Z"),
"fields" : [
"someValue"
]
}
],
但不在这里:
"subtitles" : {
"path" : "/some/path",
"fileName" : "someName"
},
这是否有助于查询这些嵌套属性?
答
这不是MongoDB,而是mongoose
。如果你不想要它,然后分配为“packageEdits”独立“模式”,并在其上设置{ "_id": false }
选项:
// 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
字段)添加到在模式中直接指定的每个数组元素,但显式类型除外。即"fields": [String]
。
保留标识符有点方便,出于以下几个原因,但如果您决定确实不想要,那么只需指定关闭此猫鼬行为的选项即可。
答
看来这些对象是在一个更大的对象内。如果是这种情况,那么“字幕”已经在母链上的一个或多个级别具有唯一标识符。 “packageEdits”也可以使用其父标识符来找到。然而,“packageEdits”里面有一个对象数组。因此,mongoDb需要通过给它一个id来为所有的数组元素设置一个地址。这是由于几个原因需要的,但我最好的选择是,如果一个数组因任何原因而改变,你不能依赖索引来给你一个特定的对象,并且通常数组中的每个对象都有相同的键。所以为了可靠地调用数组中的特定对象,你需要有一个唯一的地址。
“看起来这些对象是在一个更大的对象内” - 嗯,集合mySchema不是,也不是'subtitles','packageEdits'或这些对象的任何属性。对于数组,不能通过属性名称“fields”来解决吗?谢谢 – lance
我将不得不看看你的数据结构,以更好地了解如何解释它。我只是使用它来仔细检查,这直接来自MongoDB:“如果未指定_id字段,则MongoDB将ObjectIds用作_id字段的默认值;即如果文档不包含*_id字段,则MongoDB驱动程序添加包含ObjectId的_id字段,另外,如果mongod收到一个不包含_id字段的插入文档,mongod将添加包含ObjectId的_id字段。 [MongoDB ref](https://docs.mongodb.org/manual/reference/object-id/) –