【问题标题】:Meteor.js: Find all documents and return in reverse natural orderMeteor.js:查找所有文档并以相反的自然顺序返回
【发布时间】:2012-11-25 18:33:18
【问题描述】:

我正在尝试返回集合中的所有文档,以便在我的模板中将其与 {{#each}} 一起使用。我的代码如下所示:

return Answers.find({}, {sort: {$natural:-1}})

但是文档是按自然顺序返回的(而不是倒序)。有谁知道为什么?我从 MongoDB 文档中得到了 $natural 选择器,所以我看不出有什么问题。

【问题讨论】:

    标签: meteor mongodb-query


    【解决方案1】:

    不知道为什么它不以相反的顺序返回。

    但您可以在模板辅助方法中创建一个数组,并使用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;
    

    【讨论】:

    • 谢谢,我的问题是为什么自然顺序排序不起作用,因为我认为使用游标会更快。但是您的回答仍然有用,因为我会这样做,直到弄清楚为止。谢谢!
    • 我怀疑 Meteor 仍然不支持高级 Mongo 查询。我对游标 next() 和 hasNext() 方法有同样的问题。
    【解决方案2】:

    Sort 不是参数,而是要在 find() 之后对生成的 Cursor 对象调用的单独函数。这是 MongoDB 文档所指的方法,可与 MongoJS 等驱动程序一起使用:

    return Answers.find().sort({$natural: -1});
    

    似乎 Meteor 没有将 sort() 函数添加到他们的 Cursor 实现中,因此另一种解决方案是按 _id 基于日期(以及因此插入顺序)生成的字段:

    return Answers.find({}, {sort: {'_id': -1}});
    

    【讨论】:

    • find() 返回一个光标。我看不到 Cursor 有一个 sort() 函数:link。你的意思是 .fetch() 然后 sort()?
    • Mongo 在 Cursor 上确实有一个 sort() - docs.mongodb.org/manual/reference/method/cursor.sort - 但我猜 Meteor 的驱动程序由于某种原因没有实现它。我将修改我的答案以提供替代解决方案。
    • 无法按 ID 排序! ID(如果它是自动生成的)是基于任何内容的哈希 :) 所以你不能按它排序:\
    • 不正确。 _id 不是哈希值,它是基于多种因素生成的(前 4 个字节是插入时间 - docs.mongodb.org/manual/reference/object-id),因此基于 _id 的排序将精确到 1 秒的精度。
    • 这对我不起作用,在我的情况下,自然顺序与按 _id 排序完全不同。我猜这是由于发布后 Meteor 的更新。
    【解决方案3】:

    作为一种解决方法,您可以这样做:

    return Answers.find().fetch().reverse();
    

    我知道通过 sort 参数来做会更好,但我认为现在不可能。

    【讨论】:

      【解决方案4】:

      我认为您可能在这里混淆了“自然秩序”的定义。一方面,字母/字符串(A、B、C ...)和数字(1、2、3 ...)有自然的排序顺序。

      但在 mongo 的情况下,“自然”是指数据写入磁盘的顺序。 '{$natural:1}' 返回 '文档按照它们在磁盘上存在的顺序...',因此 '{$natural:-1}' 反转 (http://docs.mongodb.org/manual/reference/operator/meta/natural/)。

      因此,如果没有写入数据的代码以及对数据如何写入磁盘的一些了解,我们无法检验您的假设,即它不能正常工作。

      【讨论】:

      • 尽管在文档中使用了该术语,但“...存在于磁盘上”可能过于具体...据我所知,这确实是一个合乎逻辑的顺序。
      猜你喜欢
      • 2020-09-15
      • 2013-03-26
      • 2013-05-26
      • 2016-06-02
      • 2017-10-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 2015-05-05
      相关资源
      最近更新 更多