对嵌套数组进行排序不会导致顺序更改

时间:2015-12-26 11:20:07

标签: javascript mongodb meteor minimongo

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

// 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}});

但订单保持不变 - 最早的评论。

知道我错过了什么吗?

1 个答案:

答案 0 :(得分:1)

sort适用于文档级别。

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

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

Meteor并不真正支持子文档反应,所以你可以:

  1. 压扁设计,将评论分成他们自己的集合(这可能就是我在你的情况下对Meteor的处理方式)。
  2. 将文档转换为数据结构,根据需要对它们进行排序(在处理反应时可能会很头疼)。
  3. 首先按照您想要的顺序插入它们。
  4. 通过手动操作游标或使用Mongo聚合框架来处理发布期间的排序。
  5. 如果不需要嵌套,我建议将设计弄平。

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