2

MongoDB コレクションから最後の 5 つのドキュメントを取得し、新しいドキュメントを探し続けます。これは 1 つのクエリで実行できますか、それとも本当に 2 つのクエリが必要ですか? 2 つのクエリの場合、追加のフィールドを追加せずにこれを達成するための最良の方法は何ですか?

任意の言語での回答は問題ありませんが、これは私が達成しようとしていることのnode.jsコード スニペットの例です (エラー処理は省略され、スニペットは質問に対する最初の回答に基づいて編集されます)。

MongoClient.connect("mongodb://localhost:1338/mydb", function(err, db) {
  db.collection('mycollection', function(err, col) {
    col.count({}, function(err, total) {
      col.find({}, { tailable:true, awaitdata:true, timeout:false, skip:total-5, limit:5 }, function(err, cursor) {
        cursor.each(function(err, doc) { 
          console.dir(doc); // print the document object to console
        });
      });
    });
  });
});

問題: 上記のコードは、最初のドキュメントから始まるすべてのドキュメントを印刷し、さらに待機します。オプションskiplimit効果はありません。

質問: 5 つの最新ドキュメントを簡単に取得し、さらに追跡し続けるにはどうすればよいですか? node.jsである必要はありません。

4

1 に答える 1

1

(回答が編集されました。これがこれらのバージョンでは機能しないことを知っておくと便利です。)

コレクションがテーラブルでない場合は、その使用のためにアイテムがいくつあるかを調べてから、オプションcountを使用skipして最初の count-5 アイテムをスキップする必要があります。

これは機能せず、一緒に機能しません (MongoDB 2.4.6、node.js 0.10.18):tailableskip

MongoClient.connect("mongodb://localhost:1338/mydb", function(err, db) {
  db.collection('mycollection', function(err, col) {
    col.count({ }, function(err, total) {
      col.find({ }, { tailable: true, awaitdata: true, timeout: false, skip: total - 5, limit: 5 }, function(err, cursor) {
        cursor.each(function(err, doc) { 
          console.dir(doc); 
        });
      });
    });
  });
});
于 2013-09-17T13:35:54.103 に答える