我有一个事件集合,它包含一个类型
,可以是0
,1
,2
,3
,4
,5
和一个创建日期
。每个事件都与另一个名为RTS的集合相关。
我想收集每个Rts,每个类型的最后一个事件。
使用我的解决方案时出现问题:
问题是,我必须逐一描述每个类型
,以便使其工作。是否有任何解决方案可以通过type
值进行动态密钥创建?
下面是我现在得到的结果:
idrts
分组,其中包含指向第二个集合的链接。对于每个类型,将值推入特定数组。(最新的)
。[
{
$sort: {
idRTS: -1,
createdAt: -1
}
},
{
$group: {
_id: '$idRTS',
type0: {
$push: {
$cond: {
if: {
$eq: [
'$type', 0
]
},
then: '$$ROOT',
else: null
}
}
},
type5: {
$push: {
$cond: {
if: {
$eq: [
'$type', 5
]
},
then: '$$ROOT',
else: null
}
}
}
}
},
{
$project: {
_id: '$_id',
type0: {
'$filter': {
'input': '$type0',
'as': 'd',
'cond': {
'$ne': [
'$$d', null
]
}
}
},
type5: {
$filter: {
input: '$type5',
as: 'd',
cond: {
$ne: [
'$$d', null
]
}
}
}
}
},
{
$project: {
_id: '$_id',
type0: {
$arrayElemAt: [
'$type0', 0
]
},
type5: {
'$arrayElemAt': [
'$type5', 0
]
}
}
}
]
$match
键入0或5$sort
按IDRTS
和createdat
降序$group
由idrts
和createdat
字段和获取第一个对象,这将获取两种类型的第一个文档$group
按IDRTS
创建,并以k(键)和v(值)格式创建两种类型的数组$project
使用$ObjectToArray
Type
数组转换为对象
db.collection.aggregate([
{ $match: { type: { $in: [0, 5] } } },
{
$sort: {
idRTS: -1,
createdAt: -1
}
},
{
$group: {
_id: {
idRTS: "$idRTS",
type: "$type"
},
type: { $first: "$$ROOT" }
}
},
{
$group: {
_id: "$_id.idRTS",
type: {
$push: {
k: { $toString: "$type.type" },
v: "$type"
}
}
}
},
{ $project: { type: { $arrayToObject: "$type" } } }
])
操场