2016-04-04 9 views
0

最後に追加したレコードと最新レコードを取得したい。 私はカーソルを使用しようとしましたが、データを待つためにコレクションの終わりに達する前にコレクション全体をスキャンする必要があるため、時間がかかりました。大規模なMongoDBコレクションのライブデータを照会 - Nodejs

{ 
    "_id" : ObjectId("56fe349d0ef0edb520f0ca29"), 
    "topic" : "IoTeam/messages/", 
    "payload" : "20:15:04:01:12:75,-127.00,679", 
    "qos" : 0, 
    "retain" : false, 
    "_msgid" : "45975d0d.ba68a4", 
    "mac" : "20:15:04:01:12:75", 
    "temp" : "-127.00", 
    "hum" : "679", 
    "time" : "01/04/2016 15:43:09" 
} 

ありがとうございました。

+3

mongodbのパフォーマンスを向上させるためにできることはたくさんありますが、それ以上の情報はありません。スキーマ設計を投稿し、正確に何をしようとしているのかを確認し、推奨事項を提示するのがより簡単になります。 – user2263572

+0

こんにちは。あなたの答えに感謝します。 –

+0

私は10の最後のレコードとライブデータレコードを照会したい。小さなコレクションでは、カーソルを使用するときれいですが、大きなコレクション(約20000レコード)では、カーソルが最初のレコードから最後のレコードまでスキャンするのに時間がかかりすぎます。 { \t "_id":のObjectId( "56fe349d0ef0edb520f0ca29")、 \t "トピック": "IoTeam /メッセージ/"、 \t "ペイロード":「20:15:04:01:12:75、-127.00,679 "、 \t" qos ":0、 \t"保持 ":偽、 \t" _msgid ":" 45975d0d。ba68a4" 、 \t "MAC": "20:15:04:01:12:75"、 \t "TEMP": "-127.00"、 \t "ハム": "679"、 \t "時間": "01/04/2016 15:43:09" } –

答えて

0

さらに詳しい情報を知らなくても、最高の解決策はまだありません。しかし、ここであなたが試すことができる1つの提案(すべてmongoシェルを使用して)

時間キーにインデックスを作成します。

db.your_collection_name.createIndex({time:-1}) 

インデックスを作成したら、次のように入力して正しく行われたことを確認します。

db.your_collection_name.getIndexes() 

これはインデックスを一覧表示し、新しいキーがタイムキーのために追加されているはずです。

注意:これにより、時間キーのクエリにかかる時間が短縮されますが、データベースに新しいレコードを挿入するのにかかる時間が長くなります。これは、新しい挿入物を索引付けする必要があるためです。だからあなたのアプリを拡大縮小するときには、それを考慮してください、そして、あなたはこれを別のやり方で処理したいと思うでしょう。

+0

私の悪い英語のために申し訳ありません。 eとしてhttp://stackoverflow.com/questions/26592542/how-do-i-move-a-tailable-cursor-with-awaitdata-to-the-end-so-i-get-new-upda –

0

まず、フィールドtimeにインデックスを作成します。

db.collection('nameOfYourCollection') 
    .createIndex(
     { "time": -1 }, 
     null, 
     function(err, results){ 
      console.log(results); 
     }); 

これにより、コレクションのtimeフィールドにインデックスが作成されます。これには時間がかかることがあります。しかし、インデックスが作成されると、クエリははるかに高速になります。クエリでは、この後

ちょうどこの操作を行います。これはあなたのコレクションに挿入された最後の10件のレコードを与える

var cursor = db.collection('nameOfYourCollection').find().sort([ ["time", -1] ]).limit(10); 
cursor.forEach(function(doc){ 
    if(doc) console.log("Got the document as : " + JSON.stringify(doc)); 
}, function(err){ 
    if(err) console.log("Error: " + JSON.stringify(err)); 
}); 

を。

cursorforEachの代わりにtoArrayと電話することもできます。このようなもの:

var cursor = db.collection('nameOfYourCollection').find().sort([ ["time", -1] ]).limit(10); 
cursor.toArray(function(err, docs){ 
    if(err) console.log("Error: " + JSON.stringify(err)); 
    if(docs){ 
     console.log("Got the document as : " + JSON.stringify(docs)); 
     console.log("This is the latest record that was inserted : " + JSON.stringify(docs[0])); 
    } 
}); 

希望するものがあります。

+0

私もリアルタイムで挿入された新しいレコードを追跡する必要があります –

+0

更新された答えを見てください。 –

関連する問題