2016-02-25 83 views
0

爲什麼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" 
}, 

這是否有助於查詢這些嵌套屬性?

回答

2

這不是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]

保留標識符有點方便,出於以下幾個原因,但如果您決定確實不想要,那麼只需指定關閉此貓鼬行爲的選項即可。

2

看來這些對象是在一個更大的對象內。如果是這種情況,那麼「字幕」已經在母鏈上的一個或多個級別具有唯一標識符。 「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/) –