2017-03-16 27 views
0

我知道我应该研究这一点,但我是在一个严格的时间表。如何让下面的字符串:如何在下划线节点js monogodb中对此进行排序?

[ { _id: { eventName: 'sometsdf', confirmed: false }, total: 1 }, 
    { _id: { eventName: 'somethon', confirmed: true }, total: 1 }, 
    { _id: { eventName: 'somethon', confirmed: false }, total: 1 } ] 

成类似

[ { eventName: 'somethon, confirmed: 1 , unconfirmed: 1}, 
    { eventName: 'sometdsf, confirmed: 0 , unconfirmed: 1}, ] 

我已经使用聚合函数从MongoDB的如下

obj.aggregate[{ 
$group: { 
    _id: {eventName: "$eventObject.event_name", confirmed: "$confirmation"}, 
    total: {$sum: 1} 
} 
}] 

它一直只8小时,因为我已经学会关于节点js,这是后端开发人员离开后的紧急情况。请帮忙。

+0

您是否每次事件总是有最多2个条目? – Veeram

回答

0

我不确定下划线对这里的普通JS有什么帮助。你只需要遍历结果并创建映射对象。如果你使用eventName作为关键,那么结果可以轻松分组(谢谢Ninetainedo)。

let o = {} 
docs.forEach(doc => { 
    let eventName = doc._id.eventName; 
    if (!o[eventName]) o[eventName] = { confirmed:0, unconfirmed: 0}; 
    (doc._id.confirmed) 
    ? o[eventName].confirmed++ 
    : o[eventName].unconfirmed++ 
}) 

作为对象,而不是阵列即结束,现在_.map可与该对象帮助 - >阵列转换。

let grouped = _.map(o, (val, key) => { 
    val.eventName = key; 
    return val; 
}) 
+0

你错过了分组,我想。预期的输出有2而不是3的长度。 – Telokis

+0

噢耶...干杯 – Matt

1

蛮力解决方案。根本不算优雅:)

let x =[ { _id: { eventName: 'sometsdf', confirmed: false }, total: 1 }, 
    { _id: { eventName: 'somethon', confirmed: true }, total: 1 }, 
    { _id: { eventName: 'somethon', confirmed: false }, total: 1 } ] 


let y = x.reduce((result, current) => { 

    if(!result[current._id.eventName]) { 
     result[current._id.eventName] = {eventName: current._id.eventName, confirmed: 0, unconfirmed: 0} 
    } 

    if(current._id.confirmed) { 
     result[current._id.eventName].confirmed += current.total 
    } else { 
     result[current._id.eventName].unconfirmed += current.total   
    } 

    return result 
},{}) 

console.log(Object.keys(y).map(k => y[k])) 
相关问题