2015-01-05 69 views
0

我一直在環顧四周,並沒有看到任何明顯的答案這個問題;對不起,如果有,我錯過了。節點JS/Mongo插入時沒有匹配模式

因此,我現在有一個常規的NodeJS + Mongo堆棧,它一般工作。

我與像這樣的架構(簡化這個問題的目的)工作:

var ObjSchema = new Schema({ 
    name: { 
     type: String, 
     default: '', 
     trim: true 
    }, 
    description: String, 
    images: [ImageSchema], 
    ... 
}); 

現在,我不想去使實際圖像的匹配ImageSchema的麻煩數據庫,並且根據this,即使它們不匹配集合模式,也可以明顯地將文檔插入到數據庫中。因此,爲了測試目的,我只是在插入URL時手動輸入URL列表(而不是爲了測試目的而手動輸入),而不是匹配ImageSchema的對象列表。

在互動蒙戈外殼,我已經做了相當於:

db.objects.insert({ name: "Object", description: "My Collection", images: ["http://www.blah.com/img.jpg", "http://foo.com/another.jpg"]... }) 

交互式蒙戈外殼告訴我,這是好的,給我的「插入到數據庫」爵士樂。當我執行db.objects.find()時,BSON在輸入時正確顯示,其中包含'images'字符串列表,而不是與指定的ImageSchema匹配的內容。

現在,這是蹭。我的節點,而不是交互shell做同樣的命令,而BSON對象我得到的是這種等價的:

{ 
    _id: 54a9ede2da41c93989d3258d, 
    description: 'My Collection', 
    images:[], // THIS IS THE PROBLEM 
    name: 'Object' 
} 

正如你所看到的,在其他領域的罰款;搜索正確地檢索該對象,並且與該模式匹配的所有字段都可以。但是,在節點搜索中,此文檔的圖像屬性是一個空列表,而db.objects.find()爲我提供了用於測試目的而插入的URL列表。

發生了什麼事?任何想法如何獲取圖像屬性中的URL時拉節點?

我使用的命令是等價的:

Object.find({'name': 'object'}, function(err, obj) { 

和我使用的console.log(OBJ)。

+0

你在使用貓鼬嗎? – unobf

回答

1

這裏的很短的情況是MongoDB是「無模式」,但作爲ODM層的MongoDB不是。它旨在強制執行模式規則,例如類型和預期字段。

如果你想添加不架構匹配的數據,你可以隨時使用strict選項,如:

var ObjSchema = new Schema({ 
    name: { 
     type: String, 
     default: '', 
     trim: true 
    }, 
    description: String, 
    images: [ImageSchema], 
    ... 
},{ "strict": false }); // Last line is important here 

但實際上考慮您的樣本數據,如何在子文件陣列這只不同關心這些只是字符串。

var ImageSchema = new Schema({ 
    "url": String 
},{ "_id": false }); 

var ObjSchema = new Schema({ 
    name: { 
     type: String, 
     default: '', 
     trim: true 
    }, 
    description: String, 
    images: [ImageSchema], 
    ... 
},{ "strict": false }); // Last line is important here 

這是正常情況像數據:

[{ "url": "http://www.blah.com/img.jpg" }, { "url": "http://foo.com/another.jpg" }] 

但對於純粹使用「模式」爲數組元素,你可以在模式創建一個類似的特性省略所需"_id"值字符串,那麼就定義一個String型無模式定義:

var ObjSchema = new Schema({ 
    name: { 
     type: String, 
     default: '', 
     trim: true 
    }, 
    description: String, 
    images: [String], 
    ... 
},{ "strict": false }); // Last line is important here 

因此,選擇你所需要的,但對於數據你呈現THI s只是一個String數據的數組,不需要它的模式定義。

+0

這完全解決了我的問題。感謝你教育我貓鼬;我是自學成才的,所以你可以看到我沒有考慮所有的可能性。 – djbhindi