如何从Meteor中的Collection.find({})的结果中合并和排序数组?

时间:2014-05-05 20:12:43

标签: mongodb meteor aggregation-framework

我有这样的集合结构

{
    "_id" : "12ds5dsfSSFS2sfds",
    "name": "Peter Jackson",
    "films" : [
        {
            "name" : "King Kong",
            "date" : "2005"
        },
        {
            "name" : "The Hobbit: An Unexpected Journey",
            "date" : "2012"
        }
    ]
},
{
    "_id" : "HHdfdsBfSSFS2sfds",
    "name": "Martin Scorsese",
    "films" : [
        {
            "name" : "Goodfellas",
            "date" : "1990"
        },
        {
            "name" : "The Wolf of Wall Street",
            "date" : "2013"
        }
    ]
}

我需要的是这样的排序列表:

http://jsfiddle.net/K7VGy/embedded/result/

Sorted list as a result

所以,问题是 - 是否可以合并films数组中的所有字段,然后根据date对它们进行排序,然后传递给模板?

也许我选择了错误的收集结构,并且可以以某种方式进行改进?

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:3)

对于我来说,我会使用聚合方法来做这个服务器端,并且做这个服务器端你需要做一些挖掘以获得聚合方法:

var db = MongoInternals.defaultRemoteCollectionDriver().mongo.db;

db.collection("server_collection_name").aggregate([
    { "$unwind": "$films" },
    { "$sort": { "films.date": -1 } },
],
function(err,result) {

    // do work in here   
});

这将基本上返回已经格式化和订购的数据,如下所示:

{
    "_id" : "HHdfdsBfSSFS2sfds",
    "name" : "Martin Scorsese",
    "films" : {
            "name" : "The Wolf of Wall Street",
            "date" : "2013"
    }
},
{
    "_id" : "12ds5dsfSSFS2sfds",
    "name" : "Peter Jackson",
    "films" : {
            "name" : "The Hobbit: An Unexpected Journey",
            "date" : "2012"
    }
},
{
    "_id" : "12ds5dsfSSFS2sfds",
    "name" : "Peter Jackson",
    "films" : {
            "name" : "King Kong",
            "date" : "2005"
    }
},
{
    "_id" : "HHdfdsBfSSFS2sfds",
    "name" : "Martin Scorsese",
    "films" : {
            "name" : "Goodfellas",
            "date" : "1990"
    }
}

然后你可以在服务器上用它做很酷的事情,例如更改过滤,排序顺序和分页结果。

所以我认为这比在客户端上操作上面的结构更好,在这种方法中你不可能排序然后分页。

这将是更好的方式,你可以利用Meteor的publish来使这看起来更加完整,或者只是使用流星方法。有关与meteor聚合的更多信息,请参阅this other answer和另一个external discussion

另请参阅聚合框架operator reference以获取有关如何自定义的更多信息。

答案 1 :(得分:1)

如何使用下划线进行合并:

var merged = _.extend({}, first_obj, second_obj);

对于排序,我们也可以使用下划线:

var sorted = _.sortBy(merged, function(item) {
    return new Date(item.films.date)*(-1); // to convert it to negative number
}

然后在模板助手中使用新创建的排序变量来输出它。