0

次のスキーマのコレクションがあります。

{
  "_id" : ObjectId("502e66f201f04e16a8885e8c"),
  "sensorID" : 2,    // id of the sensor
  "loc" : [3, 2],    // location of the sensor x,y
  "time" : new Date("Fri, 17 Aug 2012 19:44:50 GMT +04:00")   // time of the last meausurement
}

そのため、ネットワークにはセンサーがほとんどありません。彼らは移動しており、x 秒ごとにサーバーに居場所を伝えています。

各センサーの最後に通知された場所を見つけたいと思います。

私がやろうとしていたこと:

db.runCommand({distinct: 'points', key: 'sensorID'})

すべての異なるセンサーを選択しますが、最後に追加の制約をどこに置くべきかわかりません。

そして最も重要な質問。私は実際にmongoでこれを行う必要があります。MySqlを使用する方が良いかもしれません

4

1 に答える 1

0

センサーはほぼ同時に報告しており、部分的に古いデータは許容できますか?

基本的に、この問題に対処するには多くの方法があります。

1 つは、db.collection.find({}).sort( {time: -1}).limit( #Number ofsensors#) と同様のことを行うことです。これは事実上時間の MAX 関数であり、センサーの最新の位置。ただし、このアプローチは、すべてのセンサーが同時にブロードキャストする場合にのみ機能し、もちろん、他のセンサーのいずれかのレポートが特に遅い場合、1 つのセンサーのデータが部分的に古くなったり、データが重複したりする傾向があります。遅いセンサーが最後に更新されてから 2 回更新されたため、遅いセンサーを除いてリストに 2 回表示されます。. 上記のdistinct句を追加することでこれを修正できますが、これでも古いデータになる可能性がありますが、せいぜい1回限りです。時々 1 サイクル遅れることが大したことではない場合、これはもっともらしいことです。

別のアプローチは、次のような方法で各センサーを一度に 1 つずつクエリすることです。

db.collection.find({ "センサーID : #センサーID#"}).sort( {時間: -1}).limit(1);

さらに別のアプローチは、スキーマを変更して「最新」フラグを持つようにすることです。そして、新しいセンサーのポイントと時間を挿入するときは、そのセンサーの古い「最新」ドキュメントを照会し、それを false に更新するだけです。「最新」がなく、クエリを実行している状況は望ましくないため、これには少しのエラー処理が含まれます。したがって、より良いアプローチは、最初に挿入する新しいドキュメントのフラグを true に設定することです。次に、古いドキュメント フラグを false に更新します。そして、更新の合間に一度に 1 つずつ検索する場合は、2 つを並べ替えて、制限を 1 に追加して最新のものを取得できます。または、それらすべてを一度に検索してすべてのセンサーのリストを取得したい場合、それが更新の合間に発生します。

または、 mapreduce 関数を追加し、センサーでグループ化し、時間でフィルタリングすることで、これをきれいに行うことができます。

お役に立てれば。

于 2012-08-30T17:02:12.653 に答える