我很高兴看到最近在Meteor0.6.6的minimongo中增加了对地理空间指数近乎支持的美元。但是,看起来$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}});
}
});
有没有办法让它做出反应性排序?
最佳答案
对于$near
查询的排序反应性,与minimongo中的任何其他查询一样,没有什么特别之处: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
数组中逐个显示数字。每次新号码到达时,它都会出现在正确的位置,并始终保持序列的排序。你说的“接近反应性排序”是别的意思吗?