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

How do you sort this in underscore node 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}
}
}]

学习node js才8个小时,后端开发人员走后突发状况。请帮忙。

我不确定下划线在这里是否比普通 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; 
})

暴力破解。一点都不优雅:)

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]))