1

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

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

但顺序保持不变 - 首先是最旧的评论。

知道我错过了什么吗?

4

1 回答 1

1

sort在文档级别工作。

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

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

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

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

如果嵌套不是必需的,我建议扁平化设计。

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

于 2015-12-26T16:38:25.360 回答