我知道我应该对此进行研究,但我的时间表非常严格。如何制作以下字符串:
[ { _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个小时,这是一个紧急事件,因为后端开发人员离开了。请帮忙。
答案 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;
})