在构建我的第一个 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/