我有这样的集合结构
{
"_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/
所以,问题是 - 是否可以合并films
数组中的所有字段,然后根据date
对它们进行排序,然后传递给模板?
也许我选择了错误的收集结构,并且可以以某种方式进行改进?
任何帮助将不胜感激!
答案 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
}
然后在模板助手中使用新创建的排序变量来输出它。