Javascript Meteor mongodb数据透视和更优雅的代码
我有一个箱子,里面有所有相关细节: 但为了便于回答,这里有一些细节。我有这些模型示例:Javascript Meteor mongodb数据透视和更优雅的代码,javascript,mongodb,meteor,Javascript,Mongodb,Meteor,我有一个箱子,里面有所有相关细节: 但为了便于回答,这里有一些细节。我有这些模型示例: Orders = { _id: "T487wBz7Pvzjo2QHh", beverages: [ { _id: "8ea26bb103efae385f80f881", delivered: false, name: "Wine", units: "55" } ], location: "yTKWLFwSDvp3DyCkx",
Orders = {
_id: "T487wBz7Pvzjo2QHh",
beverages: [
{
_id: "8ea26bb103efae385f80f881",
delivered: false,
name: "Wine",
units: "55"
}
],
location: "yTKWLFwSDvp3DyCkx",
locationName: "Ladies Garden",
locationNumber: "101",
timestamp: 1398393004864,
user_id: "W3Fdq36Ts2TdWxCRP",
username: "jgeezy"
};
Locations = {
_id: "yTKWLFwSDvp3DyCkx",
beverages: [
{
_id: "e5552a68266ed76895b8228a",
fillTo: "10",
name: "Wine Coolers",
orderWhen: "10",
startUnits: "10"
}
],
name: "Teen Cabana",
number: "103",
organization: "Super Happy Teens!",
vendor: false
};
我需要在每个位置的表中呈现一些行,这些行将显示每个位置的未交付饮料订单总数。我已经编写了此函数:
Template.dashboardOrders.undeliveredOrders = ->
undeliveredOrders = Orders.find({'beverages.delivered': false}, {
transform: (order) ->
order.unfilledOrders = 0
_.each order.beverages, (bev) ->
if not bev.delivered
order.unfilledOrders += 1
order
})
但这给了我一个按顺序排序的数组&时间戳。我要寻找的输出是一个按唯一位置和时间戳排序的数组。不完全确定如何到达那里,但我一直在尝试不同的map&reduce方法,因为我感觉这是一条路要走,但我被卡住了。非常感谢您的帮助
另外,由于必须返回order对象并使用+=递增,我的方法感觉不公平。我觉得也许有更好的方法可以做到这一点。为什么不:
Template.dashboardOrders.undeliveredOrders = ->
Orders.find
beverages.delivered: no
,
sort:
location: 1
timestamp: 1
?
如果你真的想要一个数组而不是一个光标,那么在末尾添加
.fetch()
。我只想添加第二个答案来回答@jasonzales的第二个问题。我的第一个答案,就是查询,返回了所有未送达的订单,并按位置和时间戳对它们进行了排序。根据评论,还需要以下内容:
我想包括每个位置的所有未交付订单,我需要每个位置的未交付订单计数
有很多方法可以实现这一点。我认为最简单的方法是不要将所有数据都挤入查询,而是处理查询返回的数据:
Template.dashboardOrders.undeliveredOrdersByLocation=->
orders=orders.find
饮料:否
,
排序:
地点:1
时间戳:1
#创建一个对象locations,按位置保存未送达的订单;
#对象键是位置id,值是mongo文档:
位置={}
#循环浏览所有未送达的订单,并将每个订单添加到locations对象:
orders.forEach(doc)->
除非位置[单据位置]?
地点[文件地点]=
未送达订单:[]
未送达订单数:0
地点:doc.location
locationName:doc.locationName
地点编号:doc.locationNumber
#等等,模板还需要什么
位置[doc.location].undeliveredOrders.push单据
位置[doc.location]。未送达订单数++
#将locations对象转换为数组以在模板中使用:
返回值(位置)#不需要保留键
您没有给出模板的示例,但您可以使用位置
数组,如下所示:
{{{#每个未送达的OrdersByLocation}
有{{locationName}的{undeliveredOrdersCount}}未送达订单:
{{#每个未交付订单}
{{username}}在{{timestamp}}上提交的订单,用于:
{{{每种饮料}
- {{units}}{{name}}的{{units}单元需要交付
{{/每个}}
{{/每个}}
{{/每个}}
根据您的需要,使用下划线方法groupBy
或groupBy
相对容易,但我不太理解这个问题。您想要按位置(即countBy
)或按位置和时间戳(即groupBy
)排序的数组显示未送达的饮料订单总数吗?很明显,它们将是两种不同的东西。谢谢你提出的更优雅的问题,但它仍然只能让我走一段路。我想包括每个位置所有未交付的订单,我需要每个位置的未交付订单计数。不!给你绿色的复选标记,我的兄弟。谢谢。通过创建更多帮助程序来检索.undeliveredOrders数组的长度等,可以避免在对象上添加额外的属性。这实际上并不影响性能,只是您喜欢如何组织代码。