2013-11-03 66 views
0

我正在開發一些小工具,用於解析某些文件,提取特定的信息,然後將它存儲到一個mongodb集合中。啓動一個命令,然後將數據發送給它

它的工作的權利,但它做類似:

#!/bin/bash 

find myFolder | while read f 
do 
    # some things 
    ... 
    # and then 

    echo "db.test.insert({'val': BinData(0, '$data')});" | mongo -quiet --host 127.0.0.1:36427 collectionName 
done 

但「問題」在這裏,我是開/關MongoDB的連接每次。
所以這裏是問題:

有沒有辦法啓動MongoDB連接,然後發生一些數據。

我知道下面的代碼是完全錯誤的,但它只是給你的那種特性的一個例子,我正在尋找:

#!/bin/bash 

mongoConn=`mongo 127.0.0.1:36427 collectionName` 

find myFolder | while read f 
    # ... 

    echo "db.test.insert(..);" > mongoConn 
done 

echo "exit;" > mongoConn 
+0

命名管道可以工作,這是您的文件夾中的一個特殊文件,其工作方式類似於管道。您可能想要在閱讀單個文件後阻止mongodb關閉,因此http://stackoverflow.com/questions/5957386/prevent-fifo-from-closing-reuse-closed-fifo可能會有所幫助。 – unique2

回答

2

以下假設您可以向mongo工具寫入多個命令。

打開一個管道作爲標準輸出到mongo命令。之後,你可以編寫你的命令。

exec > >(mongo ...) 
find ... | while read ... ; do 
    echo "db.test.insert(...);" 
done 
+0

完美!正是我在找什麼。我不知道'>(...)'。我只是改變了你的代碼,使用'exec 3>>(mongo ...)',然後'echo「db ...」>&3' :) – Tiller

+0

你應該知道這是個屁話---也就是說,擴展特定於bash ---並且不能在標準Posix shell中工作。這不是問題,但您需要確保腳本頂部的魔術直接調用bash('#!/ bin/bash')而不是默認shell('#!/ bin/sh') ,因爲默認的shell可能不是bash。 –

+0

您不需要在此進行流程替換。只需將while循環的輸出傳遞給'mongo':'find ... |同時閱讀...;做...;完成| mongo ...'。 – chepner

0

你可以嘗試這樣的:

#!/bin/bash 

deleteTmpFile(){ 
    [[ -f insert.tmp ]] && rm -rf $1 
} 

tmpFile="insert.tmp" 
deleteTmpFile $tmpFile 

find ... | while read f 
do 
    #... 
    echo "db.test.insert({'val': BinData(0, '$data')});" >> $tmpFile 
done 

cat insert.tmp|mongo -quiet --host 127.0.0.1:36427 collectionName 
deleteTmpFile $tmpFile 
+0

問題是這是一個非常漫長的過程。它解析千兆的數據,所以我不能存儲命令列表。我需要活下去。 – Tiller

+0

您可以交換文件的內容:排空tmp文件並在每50個查詢中在mongodb上運行管道。否則,請使用另一種語言提供允許我們使用持久連接的工具。 –

相關問題