【发布时间】:2012-11-25 18:33:18
【问题描述】:
我正在尝试返回集合中的所有文档,以便在我的模板中将其与 {{#each}} 一起使用。我的代码如下所示:
return Answers.find({}, {sort: {$natural:-1}})
但是文档是按自然顺序返回的(而不是倒序)。有谁知道为什么?我从 MongoDB 文档中得到了 $natural 选择器,所以我看不出有什么问题。
【问题讨论】:
标签: meteor mongodb-query
我正在尝试返回集合中的所有文档,以便在我的模板中将其与 {{#each}} 一起使用。我的代码如下所示:
return Answers.find({}, {sort: {$natural:-1}})
但是文档是按自然顺序返回的(而不是倒序)。有谁知道为什么?我从 MongoDB 文档中得到了 $natural 选择器,所以我看不出有什么问题。
【问题讨论】:
标签: meteor mongodb-query
不知道为什么它不以相反的顺序返回。
但您可以在模板辅助方法中创建一个数组,并使用array.sort() 或array.reverse() 函数返回一个数组的反转。
例如:假设你 Answers 集合看起来像这样:
Answers({ansNo: 1, ansBody: "body1"},
{ansNo: 2, ansBody: "body2"},
{ansNo: 3, ansBody: "body3"});
而要返回的数组是:
var AnswersArr = new Array();
然后在您的模板助手中:->
var tempCollection = Answers.find({});
tempCollection.forEach(function(data){
var obj = {ansNo: data.asnNo, ansBody: data.ansBody};
AnswersArr.push(abj);
});
AnswersArr.sort(function(a, b){return b.ansNo - a.ansNo;}); //sort in reverse order
return AnswersArr;
【讨论】:
Sort 不是参数,而是要在 find() 之后对生成的 Cursor 对象调用的单独函数。这是 MongoDB 文档所指的方法,可与 MongoJS 等驱动程序一起使用:
return Answers.find().sort({$natural: -1});
似乎 Meteor 没有将 sort() 函数添加到他们的 Cursor 实现中,因此另一种解决方案是按 _id 基于日期(以及因此插入顺序)生成的字段:
return Answers.find({}, {sort: {'_id': -1}});
【讨论】:
作为一种解决方法,您可以这样做:
return Answers.find().fetch().reverse();
我知道通过 sort 参数来做会更好,但我认为现在不可能。
【讨论】:
我认为您可能在这里混淆了“自然秩序”的定义。一方面,字母/字符串(A、B、C ...)和数字(1、2、3 ...)有自然的排序顺序。
但在 mongo 的情况下,“自然”是指数据写入磁盘的顺序。 '{$natural:1}' 返回 '文档按照它们在磁盘上存在的顺序...',因此 '{$natural:-1}' 反转 (http://docs.mongodb.org/manual/reference/operator/meta/natural/)。
因此,如果没有写入数据的代码以及对数据如何写入磁盘的一些了解,我们无法检验您的假设,即它不能正常工作。
【讨论】: