2016-02-13 72 views
0

我試圖更新我的收藏它有一個陣列場(最初爲空),爲此我想這個代碼在MongoDB中收集

Industry.update({_id:industryId}, 
       {$push:{categories: id:categoryId,         
         label:newCategory, 
         value:newCategory }}}}); 

沒有錯誤顯示更新的陣列場,但在我只收集空白文檔({})。

注:我有categoryIdnewCategory,所以沒有問題。 在此先感謝。

這是架構:

Industry = new Meteor.Collection("industry"); 

Industry.attachSchema(new SimpleSchema({ 
    label:{ 
     type:String 
    }, 
    value:{ 
     type:String 
    }, 
    categories:{ 
     type: [Object] 
    } 
})); 
+0

你在用什麼語言? –

+0

我正在使用流星 – user3338256

+0

你可以添加一些示例數據顯示你的集合的結構 – Nijeesh

回答

0

我不確定,但可能是錯誤發生,因爲您沒有驗證模式中的「類別」。嘗試向'類別'添加'blackbox:true',以便它接受任何類型的對象。

Industry.attachSchema(new SimpleSchema({ 
    label: { 
     type: String 
    }, 
    value: { 
     type: String 
    }, 
    categories: { 
     type: [Object], 
     blackbox:true  // allows all objects 
    }   
})); 

一旦你這樣做是試圖增加值,像這樣

var newObject = { 
    id: categoryId, 
    label: newCategory, 
    value: newCategory 
} 
Industry.update({ 
    _id: industryId 
}, { 
    $push: { 
     categories: newObject  //newObject can be anything 
    } 
}); 

這將允許您將任何類型的對象添加到類別字段。 但是你在評論中提到類別也是另一個集合。 如果你已經有了類一SimpleSchema那麼你可以驗證類別字段只接受與SimpleSchema匹配類這樣

Industry.attachSchema(new SimpleSchema({ 
    label: { 
     type: String 
    }, 
    value: { 
     type: String 
    }, 
    categories: { 
     type: [categoriesSchema] // replace categoriesSchema by name of SimpleSchema for categories 
    }   
})); 

在這種情況下,只有符合categoriesSchema的對象的對象將被允許進入類領域。任何其他類型都將被過濾掉。你也難道不得到任何錯誤的控制檯試圖插入其他類型的(這是我認爲正在發生的事情,當你嘗試按規定沒有被驗證到現在插入)

編輯:答案說明

在SimpleSchema中,當你定義一個對象數組時,你必須對它進行驗證,也就是說,你必須告訴它它可以接受哪些對象以及不能接受哪些對象。 例如,當將其定義像

... 
categories: { 
    type: [categoriesSchema] // Correct 
} 

它意味着在結構上的那些在名爲categoriesSchema另一個SimpleSchema相似的對象僅可以插入到其中。根據你的榜樣,你嘗試插入任何對象的格式應該是

{ 
    id: categoryId, 
    label: newCategory, 
    value: newCategory 
} 

的任何對象,它是這種格式的不是插入時會被拒絕。這就是爲什麼你嘗試了所有的物體插入其中,拒絕當你與你的架構構建這樣

... 
categories: { 
    type: [Object]  // Not correct as there is no SimpleSchema named 'Object' to match with 
} 

Blackbox的最初嘗試:true現在

,可以說你做什麼你的對象被過濾並且希望所有對象被插入而不用驗證。 多數民衆贊成在設置「黑盒:真正的」進來如果你像這樣定義

... 
categories: { 
    type: [Object],  // Correct 
    blackbox:true 
} 

這意味着類可以是任何對象,不必相對於其他一些SimpleSchema驗證字段。所以無論你嘗試插入都被接受。

+0

非常感謝NIjeesh ...它的技巧感謝您的幫助...謝謝你 – user3338256

+0

我會非常感謝,如果你能解釋什麼是黑匣子和如何解決我的問題 – user3338256

+0

我已經編輯了答案和解釋來回答。並且請不要忘記標記答案爲接受,如果這解決了你的問題:) – Nijeesh

0

如果您在蒙戈外殼此查詢時,它會產生一個日誌像匹配:1,更新:0。請檢查你會得到什麼。如果匹配爲0,則表示您的輸入查詢沒有任何匹配的文檔。

+0

我使用流星和類別是它的一個字段,也是一個單獨的集合 – user3338256

+0

並且由於在該字段中添加了空白{},這意味着找到了行業標識 – user3338256

+0

如果在mongo apis中沒有工作如流星或mongo java驅動程序apis,請在mongo shell中執行類似的查詢,如果它執行正確,那麼我們確定我們必須修改我們的api方法。請在mongoshell中執行以下查詢並確保其已正確更新,
db.Industry.update({_ id:industryId},{$ push:{categories: id:categoryId, label:newCategory,value:newCategory } }}}); –