膨大な量のデータを実行しようとしています。問題は、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
よろしく、
これはMongoDBの問題ではありません**。問題は、独自のバッチファイルの構築が間違っていることです。あなたは実際には、エラーは "終わりのない文字列リテラル"であると言われています。これは "構文"エラーであり、 '$ in'に与えられた引数の数とは関係ありません。 –
こんにちは。その場合、100で失敗するはずです。しかし、数字が高くなっている場合にのみ提出しています – user2854333