2012-09-06 54 views
1

我想通過mongos執行一個java腳本文件,將數據插入到我的分片集中。除此之外我要添加的動態變量和NULL值 -通過mongos和javascript插入數據

我想登錄(手動地)到所述殼由

蒙戈主機IP:端口/管理my_script.js

我的js看起來像:

var amount = 1000000; var x = 1; var doc ='';

for (i=0; i<amount; i++) 
{ 

doc = { a: '1', b: '2', c: 'text' , d: 'x', e: 'NULL'} 
db.mycol.insert(doc); 
x=x + 1 

} 

(而「×」我可以只用「我」) 做「d」寫道:「X」或只是字母「X」的價值? 「e」寫入文本「Null」或..讓我們說「數據庫NULL」 是否正確地執行該過程? (關於我如何連接到mongos /分片集)

問候

編輯: 也是非常重要的 - 我怎麼能弄清楚的時候,MongoDB的/分片設置需要存儲的所有數據?並平衡它?

編輯第二:

嗨羅斯,

我有一個由兩個碎片(二replicasets)的分片集。目前我正在測試,因此我使用循環計數器作爲分片鍵。 有沒有辦法檢查JavaScript內的時間?

更新:

所以測量所需要用於存儲數據的時間等於執行的JavaScript的時間? (或者由於執行mongo shell不可訪問的時間)

這個假設是否可以用於測量查詢響應時間? (我在哪裏必須存儲java腳本文件?)

+3

如果你想讓d爲x變量的值,並且e爲null,下面是你如何在javascript中做的事情:'doc = {a:'1',b:'2',c:'text ',d:x,e:null};' – billy

+0

非常感謝;> – Tyzak

+0

你的意思是你的分片鍵是{「d」:1} - 如果是這樣你就不會獲得平衡的寫分佈,你的鍵永遠在增加。 –

回答

1

您不需要保留多個計數器 - 因爲您在for循環的每次迭代中增加了i。當你想要的值,而不是字符串使用id價值和null而不是字符串"NULL" - 繼承人的清理循環:

var amount = 1000000; 
for (i=1; i<amount+1; i++) { 
    doc = { a: '1', b: '2', c: 'text' , d: i, e: null } 
    db.mycol.insert(doc); 
} 

至於需要多長時間儲存​​/平衡你的數據 - 取決於幾個因素。

首先,你的分片鍵是什麼?它是一個隨機值還是一個遞增值(如時間戳)。分片鍵的隨機模式有助於確保寫入操作的均勻分佈,並且如果您知道分片鍵的範圍,則可以使用pre-split the shard來嘗試確保在加載數據時保持平衡。如果分片關鍵字像時間戳那樣增加,那麼最有可能的一個分片將變爲hot並且它總是位於該範圍的頂端,並且將不得不拆分塊並將數據遷移到其他分片。

在MongoDB英國,有幾個有關分片的精彩演講:Overview of shardingSharding best practices

更新:

關於它需要多久的碎片成爲平衡 - 這取決於你的機器的負荷。平衡是一個輕量級的過程,所以應該被視爲後臺操作。需要注意的是,即使在數據寫入mongos時,即使是分片系統,也可以通過它查詢。因此,如果在數據加載過程中分片失去平衡,數據仍然可以訪問 - 根據分片的負載和新數據的增加,重新平衡分片可能需要一些時間,這意味着在遷移之前需要拆分數據塊。

UPDATE2

mongos的刀片是同步的,所以它需要運行該腳本的時間是花費應用插入的時間。還有其他一些關於使用getLastError的寫入耐久性的選項,基本上是在寫入寫入時阻塞的時間。該shell透明地調用getLastError(),但language of choice的默認值是異步的,不會等待服務器響應。

在哪裏存儲JavaScript文件? - 那就是你 - 它的應用程序代碼。大多數用戶將使用他們的首選語言編寫應用程序,並使用驅動程序調用mongodb。

+0

更新了答案 – Ross

+0

也更新了:> – Tyzak

+1

再次更新,希望能爲您澄清事情。它可能打破了這種方式更新問題的stackoverflow禮儀! – Ross