你如何在下划线节点js monogodb中对此进行排序?

时间:2017-03-16 23:25:02

标签: node.js mongodb underscore.js

我知道我应该对此进行研究,但我的时间表非常严格。如何制作以下字符串:

[ { _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}
}
}]

自从我了解了节点j以来只有8个小时,这是一个紧急事件,因为后端开发人员离开了。请帮忙。

2 个答案:

答案 0 :(得分: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]))

答案 1 :(得分: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; 
})