为什么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来为所有的数组元素设置一个地址。这是由于几个原因需要的,但我最好的选择是,如果一个数组因任何原因而改变,你不能依赖索引来给你一个特定的对象,并且通常数组中的每个对象都有相同的键。所以为了可靠地调用数组中的特定对象,你需要有一个唯一的地址。

+0

“看起来这些对象是在一个更大的对象内” - 嗯,集合mySchema不是,也不是'subtitles','packageEdits'或这些对象的任何属性。对于数组,不能通过属性名称“fields”来解决吗?谢谢 – lance

+0

我将不得不看看你的数据结构,以更好地了解如何解释它。我只是使用它来仔细检查,这直接来自MongoDB:“如果未指定_id字段,则MongoDB将ObjectIds用作_id字段的默认值;即如果文档不包含*_id字段,则MongoDB驱动程序添加包含ObjectId的_id字段,另外,如果mongod收到一个不包含_id字段的插入文档,mongod将添加包含ObjectId的_id字段。 [MongoDB ref](https://docs.mongodb.org/manual/reference/object-id/) –