如何从某个字段计算和映射数组



我创建了一个简单的mongoose查询来获取信息数组,然后对其进行排序。

const stats_m = await monthlySessions.find({}).sort({ month: 1 });

反应大致如下:

[
{
_id: 60c3dce8f27cc56bbcf20e94,
steamID: '76561199105033642',
displayName: 'username',
LastJoinDate: 'Sat Jun 12 2021 01:00:04 GMT+0300 (Eastern European Summer Time)',
LastLeaveDate: 'Sat Jun 12 2021 01:00:07 GMT+0300 (Eastern European Summer Time)',
SessionTime: 14,
UID: '60a6572b98a160df4ffc8b20',
month: 5,
year: '2021',
__v: 0
},
{
_id: 60c3ddda65e2073ea162cdfa,
displayName: 'username',
LastJoinDate: 'Sat Jun 12 2021 01:00:04 GMT+0300 (Eastern European Summer Time)',
LastLeaveDate: 'Sat Jun 12 2021 01:00:07 GMT+0300 (Eastern European Summer Time)',
SessionTime: 14,
UID: '60a6572b98a160df4ffc8b20',
month: 6,
year: '2021',
__v: 0,
steamID: '76561199105033642'
}
]

现在,我需要做的是获得字段month值相同的每个对象,并将SessionTime添加在一起,然后从中创建一个新对象,该对象将只包含monthyearSessionTime

我该怎么做?

您可以使用带有$group的聚合来执行此操作:

db.collection.aggregate([
{
$group: {
_id: {
month: "$month",
year: "$year"
},
SessionTime: {
$sum: "$SessionTime"
},

}
},
{
$project: {
_id: 0,
month: "$_id.month",
year: "$_id.year",
SessionTime: 1
}
}
])

Mongoxyland

好吧,我其实对Mongoose了解不多,但前几天我帮助一个家伙从Mongoose模型中进行了类似的数据过滤过程,获取数据很棘手。我们最终不得不使用lean((——就像我下面的一样。

您可能不需要这样做,所以下面的代码段可以将您的对象过滤成您想要的结果。它使用reduce()来跟踪和组合记录。你没有具体说明这一点,但我根据年份和月份进行了组合,因为你只指定了月份。如果我需要调整,请告诉我。我还在其中添加了一个额外的对象,以显示它是如何添加SessionTime

const stats_m = await monthlySessions.find({})
.lean().exec(function (err, docs) {
return Object.values(docs.reduce((b, a) => {
let key = a.month + '' + a.year
if (b.hasOwnProperty(key)) {
b[key].SessionTime += +a.SessionTime
} else {
b[key] = {
month: a.month,
year: a.year,
SessionTime: a.SessionTime
}
}
return b
}, {}))  
}).sort({ month: 1 });

const docs = [{
_id: '60 c3dce8f27cc56bbcf20e94',
steamID: '76561199105033642',
displayName: 'username',
LastJoinDate: 'Sat Jun 12 2021 01:00:04 GMT+0300 (Eastern European Summer Time)',
LastLeaveDate: 'Sat Jun 12 2021 01:00:07 GMT+0300 (Eastern European Summer Time)',
SessionTime: 14,
UID: '60a6572b98a160df4ffc8b20',
month: 5,
year: '2021',
__v: 0
},
{
_id: '60 c3ddda65e2073ea162cdfa',
displayName: 'username',
LastJoinDate: 'Sat Jun 12 2021 01:00:04 GMT+0300 (Eastern European Summer Time)',
LastLeaveDate: 'Sat Jun 12 2021 01:00:07 GMT+0300 (Eastern European Summer Time)',
SessionTime: 14,
UID: '60a6572b98a160df4ffc8b20',
month: 6,
year: '2021',
__v: 0,
steamID: '76561199105033642'
},
{
_id: '60 c3ddda65e2073eea162cdfa',
displayName: 'username2',
LastJoinDate: 'Sat Jun 12 2021 01:00:04 GMT+0300 (Eastern European Summer Time)',
LastLeaveDate: 'Sat Jun 12 2021 01:00:07 GMT+0300 (Eastern European Summer Time)',
SessionTime: 24,
UID: '60a6572b98a160df4ffc8b20',
month: 6,
year: '2021',
__v: 0,
steamID: '76561199105033642'
}
]
let ndocs = Object.values(docs.reduce((b, a) => {
let key = a.month + '' + a.year
if (b.hasOwnProperty(key)) {
b[key].SessionTime += +a.SessionTime
} else {
b[key] = {
month: a.month,
year: a.year,
SessionTime: a.SessionTime
}
}
return b
}, {}))
console.log(ndocs)

最新更新