3

最近、Meteor 0.6.6 で minimongo に地理空間インデックスの $near サポートが追加されたことを嬉しく思います。ただし、$near のソート動作 (距離順にソートする必要があります) が反応的であるようには見えません。つまり、ドキュメントがコレクションに追加されると、クライアントはそのドキュメントを読み込みますが、他のドキュメントよりも $near 座標に近い場合でも、常に結果リストの最後になります。ページを更新すると、順序が修正されます。

例えば:

サーバ:

Meteor.publish('events', function(currentLocation) {
    return Events.find({loc: {$near:{$geometry:{ type:"Point", coordinates:currentLocation}}, $maxDistance: 2000}});
});

クライアント:

Template.eventsList.helpers({
    events: function() {
        return Events.find({loc: {$near:{$geometry:{ type:"Point", coordinates:[-122.3943391, 37.7935434]}}, 
$maxDistance: 2000}});
    }
});

反応的にソートする方法はありますか?

4

1 に答える 1

7

minimongo の他のクエリと同様に、クエリの並べ替え反応性について特別なことは何もありません$near。minimongo は、クエリで渡された並べ替え指定子に基づいて、または$near演算子を含むクエリのデフォルトの並べ替えに基づいて、いくつかの並べ替え関数を使用します。

Minimongo はすべてをソートし、何かが更新されるたびに以前の順序と新しい順序を比較します。

元の質問から、期待する動作と代わりに何が表示されるかは不明です。前述の並べ替えが反応的に機能することを証明するために、それを示すミニアプリを作成しました。

HTML テンプレート:

<body>
  {{> hello}}
</body>

<template name="hello">
  Something will go here:
  {{#each things}}
    <p>{{name}}
  {{/each}}
</template>

および JS ファイル:

C = new Meteor.Collection('things');

if (Meteor.isClient) {
  Template.hello.things = function () {
    return C.find({location:{$near:{$geometry:{type: "Point",coordinates:[0, 0]}, $maxDistance:50000}}});
  };

}

if (Meteor.isServer) {
  Meteor.startup(function () {
    C.remove({});

    var j = 0;
    var x = [10, 2, 4, 3, 9, 1, 5, 4, 3, 1, 9, 11];

    // every 3 seconds insert a point at [i, i] for every i in x.
    var handle = Meteor.setInterval(function() {
      var i = x[j++];
      if (!i) {
        console.log('Done');
        clearInterval(handle);
        return;
      }

      C.insert({
        name: i.toString(),
        location: {
          type: "Point",
          coordinates: [i/1000, i/1000]
        }
      });
    }, 3000);
  });
}

アプリケーションを起動してブラウザを開いた直後に表示されるもの:x配列から番号が 1 つずつ画面に表示されます。新しい番号が到着するたびに、正しい場所に表示され、シーケンスが常にソートされます。

「$ニアリアクティブソート」とは何か別のことを意味していましたか?

于 2013-10-27T20:59:11.690 に答える