2013-03-05 57 views
0

我想要使用導出/導入在MongoDB數據庫之間移動一些數據。我有一個數組字段的嵌入式文檔,我想用其更新另一個數據庫。mongoexport包含ID和導入不會忽略它們

我的第一個問題是試圖從嵌入式文檔中只導出我需要的字段,我可以得到整個subdoc,但不只是我想要的字段。好的,那不是一個表演塞。這是我的出口指令;

mongoexport -d mydb -c mycollection -o ~/temp/mongoexport/myexport.json -f id_field,subdoc_field2 -q '{$query:{"subdoc.subfield":{"$exists":true}}}'  

我得到的東西,看起來像這樣

{ "_id" : { "$oid" : "5060f491585dc52991000002" }, "id_field" : "R0410202", "subdoc" : [ { "_id" : { "$oid" : "50eb073d585dc586d600363e" },"subdoc_field1": "value1", "subdoc_field2": [intval1, intval2]}]} 
{ "_id" : { "$oid" : "5060f491585dc52991000003" }, "id_field" : "R0410202", "subdoc" : [ { "_id" : { "$oid" : "50eb073d585dc586d600364d" },"subdoc_field1": "value2", "subdoc_field2": [intval3, intval4]}]} 

當我嘗試導入它,它不會更新匹配的文檔。這是我的命令;

mongoimport -c mycollection --db assr3_production --file ~/temp/mongoexport/myexport.json -f subdoc_field2 --upsert --upsertFields id_field  

我收到一條錯誤消息「無法更改文檔的_id」。我沒有試圖改變ID,但它似乎試圖反正。

有沒有辦法讓出口不包含id,或者讓導入忽略它們?謝謝你的幫助!

+0

如果您刪除--upsertFields選項,則導入將完成,但我不認爲這就是您想要執行的操作。 導出沒有給你你想要的字段,因爲a)它似乎只在--csv模式下執行,而b)子目錄是一個數組。如果你將它指定爲subdoc.0.subdoc_field2,你會得到你想要的字段。 我認爲這不是你想要做的原因,是因爲在插入模式下的導入將用你提供的字段替換整個文檔。因此,如果您只挑選了一對夫婦字段,那麼在您導入後這些都是文檔中的內容。 – grund 2013-03-05 20:59:46

+0

我剛剛重讀文檔,這裏是--upsert的相關行,「修改導入過程以更新數據庫中的現有對象,如果它們與導入的對象相匹配」。我讀到的意思是更新不能取代,但它似乎試圖取代。我只是在尋找一種無需編寫代碼即可移動數據的方法。感謝您的高舉。 – SteveO7 2013-03-05 21:13:03

回答

0

Steve07,您想要使用投影從您的查詢結果中顯式刪除_id。

查看here瞭解詳情。

+0

我會盡快看看,謝謝! – SteveO7 2013-04-02 17:21:34