对嵌套数组进行排序不会改变顺序

Sorting of the nested array causes no changes in order

本文关键字:改变 顺序 排序 嵌套 数组      更新时间:2023-09-26

我有一个用以下结构定义的集合:

// Websites
{
    _id: "adasdasda",
    title: "Site 1",
    comments: [{
        text: "nice site 2014",
        createdOn: "Sat Dec 26 2014 11:28:57 GMT+0100 (CET)"
    }, {
        text: "nice site 2015",
        createdOn: "Sat Dec 26 2015 11:28:57 GMT+0100 (CET)"
    }]
}

我想以适当的评论顺序显示这些信息。这意味着在我的情况下,首先是最新的评论。

我尝试使用:

Websites.findOne({_id:this.params._id}, {sort:{"comments.createdOn": 1}});

和:

Websites.findOne({_id:this.params._id}, {sort:{"comments.createdOn": -1}});

但顺序保持不变——最古老的评论优先。

知道我错过了什么吗?

sort在文档级别工作。

这将获取所有匹配的文档,根据子文档中的第一个条目(每个文档数组中第一个元素的创建时间)对它们进行排序,并返回列表中的第一份文档。

由于您已经通过_id进行了查询,所以这种排序几乎是徒劳的。

Meteor并不真正支持子文档反应性,因此您可以:

  1. 将设计扁平化,将评论分离成自己的集合(在你的情况下,这可能是我对Meteor所做的)
  2. 将文档转换为一个数据结构,根据需要对其进行排序(在处理反应性时,这可能会让人头疼)
  3. 按照你想要的顺序插入它们
  4. 在发布过程中,通过手动操作光标或使用Mongo聚合框架来进行排序

如果嵌套不是一个要求,我建议将设计扁平化。

以下是一些有关SO和Meteor论坛问题的提示:

  • MongoDB:排序对象的嵌套数组

  • 如何在mongoDB 中对集合记录中的数组进行排序

  • 嵌套子文档是个坏主意吗?(流星论坛讨论)