2014-02-05 85 views
3

我有一個MongooseJS模式,其中一個父文檔引用一組的子文件:不能.push()子文檔轉換成貓鼬陣列

var parentSchema = mongoose.Schema({ 
    items : [{ type: mongoose.Schema.Types.ObjectId, ref: 'Item', required: true }], 
... 
}); 

爲了測試我想填充項目陣列上的一些虛擬值父文檔,而無需將它們保存到MongoDB的:

var itemModel = mongoose.model('Item', itemSchema); 
var item = new itemModel(); 
item.Blah = "test data"; 

然而,當我嘗試這個對象推入陣中,只有_id存儲:

parent.items.push(item); 
console.log("...parent.items[0]: " + parent.items[0]); 
console.log("...parent.items[0].Blah: " + parent.items[0].Blah); 

輸出:

...parent.items[0]: 52f2bb7fb03dc60000000005 
...parent.items[0].Blah: undefined 

我可以做的`.populate( '項目')在某種程度上等同? (即:當您從MongoDB中讀取文檔時您將填充數組的方式)

回答

5

在您的問題詳情中,您自己的調查顯示您正在推送文檔,因爲您可以找到它的值爲_id值。但這不是真正的問題。考慮下面的代碼:

var mongoose = require('mongoose'); 
var Schema = mongoose.Schema; 

mongoose.connect('mongodb://localhost/nodetest') 

var childSchema = new Schema({ name: 'string' }); 
//var childSchema = new Schema(); 


var parentSchema = new Schema({ 
    children: [childSchema] 
}); 

var Parent = mongoose.model('Parent', parentSchema); 
var parent = new Parent({ children: [{ name: 'Matt' }, { name: 'Sarah'}] }); 

var Child = mongoose.model('Child', childSchema); 
var child = new Child(); 
child.Blah = 'Eat my shorts'; 
parent.children.push(child); 
parent.save(); 

console.log(parent.children[0].name); 
console.log(parent.children[1].name); 
console.log(parent.children[2]); 
console.log(parent.children[2].Blah); 

因此,如果這個問題現在不站出來,交換註釋行爲childSchema的定義。

// var childSchema = new Schema({ name: 'string' }); 
var childSchema = new Schema(); 

現在,這顯然將表明存取的沒有定義,這帶來的問題:「在你的架構中定義的‘胡說’訪問」

所以它要麼不是或者在定義中存在類似的問題。

+0

在我的測試中,我沒有調用parent.save(),因爲測試的工作方式。我懷疑這就是爲什麼我不能訪問子對象 –

+0

問題不在於save()與Schema定義。正如我所展示的,嘗試上面的代碼或帶有**空白** Schema對象的代碼,您將看到所有訪問器都失敗。 'Blah'需要在Schema中定義。 –

+0

對我不起作用,我嘗試了findOne並使用save()推送到該子目錄。它會創建新記錄而不是將新項目推送到subdoc – Alex