Meteorコレクションから2つのランダムなアイテムを公開するにはどうすればよいですか?

マルティマティックス

コレクションからランダムに2つをユーザーに表示するアプリを作っています。ユーザーがページを更新したりボタンをクリックしたりするたびに、別のランダムなアイテムのペアを取得します。

たとえば、コレクションが果物の場合、次のようなものが必要です。

リンゴvsバナナ

ピーチvsパイナップル

バナナvsピーチ

以下のコードはサーバー側用であり、ランダムペアが1回だけ生成されるという事実を除いて機能します。サーバーが再起動されるまで、ペアは更新されません。generate_pair()一度だけ呼び出されるからだ思います関数のgenerate_pair()1つから呼び出してみましたが、Meteor.publishたまにしか機能しません。また、アイテムがない(エラー)か、アイテムが1つしかない場合もあります。

コレクション全体を公開し、クライアント側からランダムなアイテムを選択してもかまいません。Items30,000エントリある場合、ブラウザをクラッシュさせたくありません

結論として、クライアント側に表示されるコレクションから2つのランダムなアイテムを取得する方法について誰かがアイデアを持っていますか?

var first_item, second_item;

// This is the best way I could find to get a random item from a Meteor collection
// Every item in Items has a 'random_number' field with a randomly generated number between 0 and 1
var random_item = function() {
  return Items.find({
    random_number: {
      $gt: Math.random()
    }
  }, {
    limit: 1
  });
};

// Generates a pair of items and ensure that they're not duplicates.
var generate_pair = function() {
  first_item = random_item();
  second_item = random_item();

  // Regenerate second item if it is a duplicate
  while (first_item.fetch()[0]._id === second_item.fetch()[0]._id) {
    second_item = random_item();
  }
};

generate_pair();

Meteor.publish('first_item', function() {
  return first_item;
});

// Is this good Meteor style to have two publications doing essentially the same thing?
Meteor.publish('second_item', function() {
  return second_item;
});
saimeunt

あなたのアプローチの問題は、同じ引数(この場合は引数なし)で同じパブリケーションをクライアントで何度もサブスクライブすると、サーバー側ロジックに1回だけサブスクライブされることです。これは、Meteorがその最適化を行っているためです。内部Pub / Subメカニズム。

以前のサブスクリプションを本当に破棄し、サーバー側の公開コードで2つの新しいランダムなドキュメントを再実行して送信するには、パブリケーションに役に立たないランダムな引数を導入する必要があります。クライアント側のコードは、パブリケーションに何度もサブスクライブします。乱数を使用して、購読を解除し、新しいランダムドキュメントを再購読するたびに。

このパターンの完全な実装は次のとおりです。

server/server.js

function randomItemId(){
  // get the total items count of the collection
  var itemsCount = Items.find().count();
  // get a random number (N) between [0 , itemsCount - 1]
  var random = Math.floor(Random.fraction() * itemsCount);
  // choose a random item by skipping N items
  var item = Items.findOne({},{
    skip: random
  });
  return item && item._id;
}

function generateItemIdPair(){
  // return an array of 2 random items ids
  var result = [
    randomItemId(),
    randomItemId()
  ];
  //
  while(result[0] == result[1]){
    result[1] = randomItemId();
  }
  //
  return result;
}

Meteor.publish("randomItems",function(random){
  var pair = generateItemIdPair();
  // publish the 2 items whose ids are in the random pair
  return Items.find({
    _id: {
      $in: pair
    }
  });
});

client/client.js

// every 5 seconds subscribe to 2 new random items
Meteor.setInterval(function(){
  Meteor.subscribe("randomItems", Random.fraction(), function(){
    console.log("fetched these random items :", Items.find().fetch());
  });
}, 5000);

meteor add randomこのコードが機能するために必要です。

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

2つのコレクションアイテムをアイテムで構成するにはどうすればよいですか?

分類Dev

2つのランダムな配列から同じ数のアイテムを取得するにはどうすればよいですか?

分類Dev

Pythonセットから2つのランダムなアイテムを選択するにはどうすればよいですか?

分類Dev

コレクションからすべてのネストされたアイテムを取得するにはどうすればよいですか?

分類Dev

Pythonディクショナリのアイテムをランダムな順序でループするにはどうすればよいですか?

分類Dev

2つの異なるアレイを接続し、それらを同時にランダム化するにはどうすればよいですか?

分類Dev

Laravel 5のコレクションからアイテムを取得するにはどうすればよいですか?

分類Dev

デリゲートのコレクションビューセルからindexPathアイテムを取得するにはどうすればよいですか?

分類Dev

Meteor 1.3:ユーザーのdbコレクションからいくつかのフィールドを含むクライアントのみのコレクションを作成するにはどうすればよいですか?

分類Dev

Spring Data / JPA:複数の子コレクションを持つアイテムを保存するにはどうすればよいですか?

分類Dev

ReactiveMongo:コレクションから複数のドキュメントをランダムに選択するにはどうすればよいですか?

分類Dev

アイテムのコレクションがリストにあるかどうかを検索するにはどうすればよいですか?

分類Dev

Google Apps ScriptからGoogleスライドのプレゼンテーションを公開するにはどうすればよいですか?

分類Dev

Smalltalkのコレクションから特定の数のランダム要素を取得するにはどうすればよいですか?

分類Dev

Meteor-サーバー側のメソッド内から特定の期間が経過した後、コレクションから単一のアイテムを自動的に削除するにはどうすればよいですか?

分類Dev

RxJavaで遅延してコレクションからアイテムを発行するにはどうすればよいですか?

分類Dev

セクションヘッダーのレイアウトとアイテムのレイアウトが異なる、スピナーアイテムリストに2つのセクションを含めるにはどうすればよいですか?

分類Dev

アイテムの1つがアクティブアイテムであるアイテムのコレクションをモデル化するにはどうすればよいですか?

分類Dev

コレクション名(ArrayList、LinkedListなど)とコレクション内のアイテムを指定してコレクションを作成するにはどうすればよいですか?

分類Dev

Jekyll / Liquidコレクションアイテムを3つのバッチで繰り返すにはどうすればよいですか?

分類Dev

テーブルまたはコレクションビューの下部にアイテムを追加するにはどうすればよいですか?

分類Dev

最初のコレクションを優先して、任意の2つのBlockingCollectionからアイテムを取得するにはどうすればよいですか?

分類Dev

別売りのアイテムのコレクションの販売テーブルを作成するにはどうすればよいですか?

分類Dev

Dockerコンテナ内のアプリケーションからWebサービスを公開するにはどうすればよいですか?

分類Dev

注文したキー/ペアコレクションの前のアイテムを取得するにはどうすればよいですか?

分類Dev

2sxcデータストリームからランダムなアイテムを選択するにはどうすればよいですか?

分類Dev

キーに基づいてLaravelコレクションのアイテムをマージするにはどうすればよいですか?

分類Dev

選択したアイテムのIDが表示されない2つのドロップダウンを選択します。コントローラーバインドにアクセスするにはどうすればよいですか。

分類Dev

2つのリストボックスに同じアイテムコレクションがあるかどうかを確認するにはどうすればよいですか?

Related 関連記事

  1. 1

    2つのコレクションアイテムをアイテムで構成するにはどうすればよいですか?

  2. 2

    2つのランダムな配列から同じ数のアイテムを取得するにはどうすればよいですか?

  3. 3

    Pythonセットから2つのランダムなアイテムを選択するにはどうすればよいですか?

  4. 4

    コレクションからすべてのネストされたアイテムを取得するにはどうすればよいですか?

  5. 5

    Pythonディクショナリのアイテムをランダムな順序でループするにはどうすればよいですか?

  6. 6

    2つの異なるアレイを接続し、それらを同時にランダム化するにはどうすればよいですか?

  7. 7

    Laravel 5のコレクションからアイテムを取得するにはどうすればよいですか?

  8. 8

    デリゲートのコレクションビューセルからindexPathアイテムを取得するにはどうすればよいですか?

  9. 9

    Meteor 1.3:ユーザーのdbコレクションからいくつかのフィールドを含むクライアントのみのコレクションを作成するにはどうすればよいですか?

  10. 10

    Spring Data / JPA:複数の子コレクションを持つアイテムを保存するにはどうすればよいですか?

  11. 11

    ReactiveMongo:コレクションから複数のドキュメントをランダムに選択するにはどうすればよいですか?

  12. 12

    アイテムのコレクションがリストにあるかどうかを検索するにはどうすればよいですか?

  13. 13

    Google Apps ScriptからGoogleスライドのプレゼンテーションを公開するにはどうすればよいですか?

  14. 14

    Smalltalkのコレクションから特定の数のランダム要素を取得するにはどうすればよいですか?

  15. 15

    Meteor-サーバー側のメソッド内から特定の期間が経過した後、コレクションから単一のアイテムを自動的に削除するにはどうすればよいですか?

  16. 16

    RxJavaで遅延してコレクションからアイテムを発行するにはどうすればよいですか?

  17. 17

    セクションヘッダーのレイアウトとアイテムのレイアウトが異なる、スピナーアイテムリストに2つのセクションを含めるにはどうすればよいですか?

  18. 18

    アイテムの1つがアクティブアイテムであるアイテムのコレクションをモデル化するにはどうすればよいですか?

  19. 19

    コレクション名(ArrayList、LinkedListなど)とコレクション内のアイテムを指定してコレクションを作成するにはどうすればよいですか?

  20. 20

    Jekyll / Liquidコレクションアイテムを3つのバッチで繰り返すにはどうすればよいですか?

  21. 21

    テーブルまたはコレクションビューの下部にアイテムを追加するにはどうすればよいですか?

  22. 22

    最初のコレクションを優先して、任意の2つのBlockingCollectionからアイテムを取得するにはどうすればよいですか?

  23. 23

    別売りのアイテムのコレクションの販売テーブルを作成するにはどうすればよいですか?

  24. 24

    Dockerコンテナ内のアプリケーションからWebサービスを公開するにはどうすればよいですか?

  25. 25

    注文したキー/ペアコレクションの前のアイテムを取得するにはどうすればよいですか?

  26. 26

    2sxcデータストリームからランダムなアイテムを選択するにはどうすればよいですか?

  27. 27

    キーに基づいてLaravelコレクションのアイテムをマージするにはどうすればよいですか?

  28. 28

    選択したアイテムのIDが表示されない2つのドロップダウンを選択します。コントローラーバインドにアクセスするにはどうすればよいですか。

  29. 29

    2つのリストボックスに同じアイテムコレクションがあるかどうかを確認するにはどうすればよいですか?

ホットタグ

アーカイブ