モデムとメッセージを保存し、それらを関連付ける必要があります。これにより、最初に、どのモデムにも関連付けられていない新しいものとして保存されます。各メッセージのルーティングに関しては、最初に、どの接続モデムが最も多くのメッセージを送信したかをクエリする必要があります。ルーティングしたいメッセージの番号。より多くのメッセージがあるものを取得するために、desc を注文する必要があります。現時点では、メッセージが割り当てられているか、送信されているか (ステータス) は気にしないので、各モデムの番号のすべてのメッセージを探すだけです。弾薬の多い方にメッセージを送信しました。それらのどれにもその番号のメッセージがないことがわかった場合は、別のクエリを作成する必要があります。「割り当てられた」メッセージが最も少ないモデムが、割り当てられたメッセージが最も少ないモデムに送信します。(編集)
クエリを最大限に高速化できるように、ドキュメントのモデル化を手伝ってくれる人はいますか?
今、私は次のようにしています:
modem
{
id:rethink internal,
imei:primary,
connected:boolean,
messages:array of messages ids
.. other less important args..
}
messages:
{
id:rethinkdb internan,
id_sms: I bring it from another system, I use it as primary,
message:the body,
status:new/assigned/sent
}
私が持っているクエリを試すと、メッセージをルーティングするのに最大 1 秒かかります。これは、必要なものに対して長すぎます。
これらは私が使用しているクエリです
メッセージ数が最も多いモデムを表示します。
r.table('modems').getAll(true,{index:'connected'})
.map(function(modem) {
return {imei: modem('imei'),
count: r.table('messages')
.getAll(r.args(modem('messages')))('number').count(msg.sms.number)}})
.orderBy(r.desc('count'))
.limit(1)
「割り当てられた」メッセージが最も少ないモデム
r.table('modems').getAll(true,{index:'connected'})
.map(function(modem) {
return {
imei: modem('imei'),
count: r.table('messages')
.getAll(r.args(modem('messages')))('status')
.count('asigned')
}
})
.orderBy(r.asc('count'))
.limit(1)
もっと良い方法があるに違いありません。インデックスを使用しても rethinkdb がそれほど遅いとは思いません。
現在、3 つのモデムと 19k メッセージがあります。最初のクエリは約 400 ミリ秒かかり、2 番目のクエリは 500 ミリ秒以上かかります。