2017-08-16 15 views
0

膨大な量のデータを実行しようとしています。問題は、100個のオブジェクトを配列に渡すと完全に正常に動作しますが、150個以上保持してしまうと失敗に終わります。

例: -

DBQuery.shellBatchSize = 100000 ; 
permissibleCars = [ "C:1456797:665","C:146:5722","C:145:57805","C:146:6070","C:14:60908"] 
db.getCollection('contracts').aggregate([ 
{$match: 
    {   "methods.name": "image", 
      "methods.status": "ACTIVE", 
      container: {"$in": permissibleCars}, 
      Class : "Download" 

} },    
{"$group" : {_id:"$container", count:{$sum:1}}}], 
{ allowDiskUse: true} 
); 

これはpermissibleCarsに限界まで完全に正常に動作しますが低く、100を言うが、今はそれが150を横切るか、それは以下のエラーでランダムに失敗を開始します。

2017-08-16T21:30:35.101+0000 E QUERY [thread1] SyntaxError: unterminated string literal @(shell):1:4091 
2017-08-16T21:30:35.132+0000 E QUERY [thread1] SyntaxError: missing ; before statement @(shell):1:6 
2017-08-16T21:30:35.162+0000 E QUERY [thread1] SyntaxError: missing ; before statement @(shell):1:2 
2017-08-16T21:30:35.193+0000 E QUERY [thread1] ReferenceError: permissibleCars is not defined : 

これはうまく動作して以来、構文の問題にはなりません。

とにかくこれを固定して、より多くの変数を渡すことができます。私はこれをシェルで実行しています。

for((i=0; i < ${#arr[@]}; i+=batchsize)) 
    do 
    set display=lastline 
    IFS=, 
    part=("${arr[@]:i:batchsize}") 
    { echo "DBQuery.shellBatchSize = $contracts_count ; "; cat query/container_count_tmp.js; } > query/container_count.js 
    sed -i "2i permissibleCars = [ ${part[*]} ]" query/container_count.js 
    mongo mngdb-test-02:27068/test_db -u test_user -p test123 <query/container_count.js>> output/container_count.txt 
done 

アレイDeclation: -

distinct_array=`sed ':a;N;$!ba;s/\n/ /g' output/userdistinct.txt` 
declare -a arr=($distinct_array) 
echo " Total Number of Distinct Ids Stored in Array ${#arr[@]}" 
batchsize=150 

すべてのヘルプは高く評価されます。 注: - ページmongodb $in limitはほとんど情報がないことを確認しました。

テスト用にサンプルデータをアップロードし、問題を再現しました。 https://drive.google.com/file/d/0ByHEfbo541jIYlJhSGJIdElCODQ/view?usp=sharing

よろしく、

+0

これはMongoDBの問題ではありません**。問題は、独自のバッチファイルの構築が間違っていることです。あなたは実際には、エラーは "終わりのない文字列リテラル"であると言われています。これは "構文"エラーであり、 '$ in'に与えられた引数の数とは関係ありません。 –

+0

こんにちは。その場合、100で失敗するはずです。しかし、数字が高くなっている場合にのみ提出しています – user2854333

答えて

0

これは、MongoDBの制限はありませんが、POSIX標準sedの実装を使用している場合は、バイトの長さの制限は8192バイトです。これは、配列文字列が切り捨てられたために構文エラーが発生する理由を説明します。この問題を回避するために

https://www.gnu.org/software/sed/manual/html_node/Limitations.html

、代わりのsedのPerlを使用:

のPerl -ni -e「印刷、印刷 'permissibleCars = $ {一部[*]}]' $場合==。 2 "query/container_count.js

+0

これには何らかの回避策がありますか? – user2854333

+0

perl: perl -ni -e "print; print \" permissibleCars = [$ {part [*]} "\ n \" if $。== 2 "query/container_count.js – anhlc

+0

これはエラーで失敗し続けます: "$。== 2"の場合、クエリは/ container_countになります。 - root @ vm-test-001:〜/ mongosearch#perl -ni -e "print; print \" permissibleCars = [$ {part [*]} .js オペレータが-e行1で期待していた場所を見つけました。allowissCars = ["C" (Cの前に見つからなかった演算子) – user2854333

関連する問題