javascript - 对集合中的条目进行分类

标签 javascript mongodb meteor

在构建我的第一个 Meteor 应用程序时,我发现了一些我什至不知道如何处理的东西。 我有一个集合中的条目列表,我想按日期对它们进行分类(而不是按日期对它们进行排序)。每个条目都有一个日期,我想建立一个类似时间线的东西。这些条目之一如下所示:

{
  "_id": "xHmfEc5gMmGzDZgD2",
  "title": "sth",
  "labels": [
    "pv4LnWNheyYRJqG7D"
  ],
  "images": [
    "zitE3FwmesHsNCxGG",
    "kYQTJYApDxPr4sMdW",
    "4enopyawfqBXRDvuh"
  ],
  "author": "TMviRL8otm3ZsddSt",
  "createdAt": "2016-01-31T21:05:55.401Z",
  "date": "2016-01-31T21:05:55.401Z",
  "description": "desc"
}

最后我想要实现像时间线这样的东西,并且我希望条目属于一天。下面是按天划分的时间线,每个条目属于一天:

日 - 2016 年 2 月 11 日

条目 - xHmfEc5gMmGzDZgD2

参赛作品 - ZhmfEc5gMmGzDZg8z

条目 - uafEc5gMmGzDZgD25

日 - 2016 年 2 月 12 日

条目 - xHmfEc5gMmGzDZgD2

参赛作品 - ZhmfEc5gMmGzDZg8z

日 - 2016 年 2 月 17 日

条目 - xHmfEc5gMmGzDZgD2

参赛作品 - ZhmfEc5gMmGzDZg8z

条目 - xHmfEc5gMmGzDZgD2

参赛作品 - ZhmfEc5gMmGzDZg8z

但我想从条目中获取日期,而不是为日历创建单独的集合。如果可以的话....

实现这一目标的好方法是什么?

目前我能想到的唯一方法是将条目中的所有不同日期存储到一个单独的集合中,然后每天都应该查询条目集合以获取合适的日期。但我认为这是一个非常糟糕的方法,因为我每天都会有一个数据库查询......

最佳答案

您可能需要使用aggregation framework 为此,但由于 meteor 中尚不支持聚合,因此您需要安装聚合框架包 - 它不会做任何花哨的事情,只是为您包装了一些 Mongo 方法。

只是 meteor 添加 meteorhacks:aggregate 你应该做生意。这将为 Meteor 添加适当的聚合支持。

现在您需要此管道来实现所需的结果。在 mongo shell 中,运行以下命令:

var pipeline = [
    {
        "$project": {
            "yearMonthDay": { "$dateToString": { "format": "%Y-%m-%d", "date": "$date" } },         
        }
    },
    {
        "$group": {
            "_id": "$yearMonthDay",
            "entries": { "$push": "$_id" }
        }
    }
];

db.entry.aggregate(pipeline);

在 Meteor 中,您可以将这些结果发布到客户端的 Entries 集合中:

Meteor.publish('getDayCategorisedEntries', function (opts) {

    var initializing = 1;

    function run(action) {

        // Define the aggregation pipeline ( aggregate(pipeline) )
        var pipeline = [
            {
                "$project": {
                    "yearMonthDay": { "$dateToString": { "format": "%Y-%m-%d", "date": "$date" } },         
                }
            },
            {
                "$group": {
                    "_id": "$yearMonthDay",
                    "entries": { "$push": "$_id" }
                }
            }
        ];

        Entries.aggregate(pipeline).forEach(function(e){
            this[action]('day-entries', e._id, e)
            this.ready()
        });
    };

    // Run the aggregation initially to add some data to your aggregation collection
    run('added');

    // Track any changes on the collection we are going to use for aggregation
    var handle = Entries.find({}).observeChanges({
        added(id) {
            // observeChanges only returns after the initial `added` callbacks
            // have run. Until then, we don't want to send a lot of
            // `self.changed()` messages - hence tracking the
            // `initializing` state.
            if (initializing && initializing--) run('changed');
        },
        removed(id) {
            run('changed');
        },
        changed(id) {
            run('changed');
        },
        error(err) {
            throw new Meteor.Error('Uh oh! something went wrong!', err.message)
        }
    });

    // Stop observing the cursor when client unsubs.
    // Stopping a subscription automatically takes
    // care of sending the client any removed messages.
    this.onStop(function () {
        handle.stop();
    });
});

以上观察变化,并在必要时重新运行聚合。

关于javascript - 对集合中的条目进行分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35132082/

相关文章:

javascript - Meteor - 有条件地显示集合

javascript - 如何将不同键的对象数组合并为一个数组中的一个键

javascript - 3d基础知识绘制魔方

javascript - 使用 Javascript Use API 获取标签列表

node.js - 获取字段不是特定字符串的文档

javascript - 无法获取/帖子

javascript - template.data._id 在 Meteor 中做什么?

mongodb - 使用 Meteor 的 settings.json 连接本地 MongoDB

offline - Meteor 应用程序如何离线工作?

javascript - .trim() 不是函数