如果组事件的数量超过3个,我想通过它们的pid (仅组)对某些特定记录进行分组。
示例:
这里,group (pid: 200)的事件数为4,必须分组。
- Events -
----------
{_id: ObjectId, type: 'private', pid: 140, data: {...}},
{_id: ObjectId, type: 'group', pid: 800, data: {...}}, // << group 800
{_id: ObjectId, type: 'group', pid: 200, data: {...}}, // << group 200
{_id: ObjectId, type: 'group', pid: 200, data: {...}}, // << group 200
{_id: ObjectId, type: 'private', pid: 140, data: {...}},
{_id: ObjectId, type: 'group', pid: 200, data: {...}}, // << group 200
{_id: ObjectId, type: 'group', pid: 200, data: {...}}, // << group 200
{_id: ObjectId, type: 'private', pid: 130, data: {...}},在这里,group (pid: 200)被分组,is_too_long: true被添加到记录中。并且group (pid: 800)没有按预期进行分组。
- Results -
-----------
{_id: ObjectId, type: 'private', pid: 140, data: {...}},
{_id: ObjectId, type: 'group', pid: 800, data: {...}, is_too_long: false}, // << group 800
{_id: ObjectId, type: 'private', pid: 140, data: {...}},
{_id: ObjectId, type: 'group', pid: 200, is_too_long: true}}, // << group 200 (with [is_too_long: true])
{_id: ObjectId, type: 'private', pid: 130, data: {...}, is_too_long: false},我尝试了一些其他的查询,但都没有用!请帮帮我!
发布于 2021-02-06 12:36:39
$facet来分离private和group文档,$group由pid和group文档组成$cond,否则为false$map迭代docs数组的循环并放置布尔属性is_too_long$unwind解构root阵列$replaceRoot将root对象替换为根$concatArrays、concat private和group数组$unwind解构root阵列$replaceRoot替换根目录中的root对象db.collection.aggregate([
{
$facet: {
private: [{ $match: { type: "private" } }],
group: [
{ $match: { type: "group" } },
{
$group: {
_id: "$pid",
root: { $push: "$$ROOT" }
}
},
{
$project: {
root: {
$cond: [
{ $gte: [{ $size: "$root" }, 3] },
{
is_too_long: true,
docs: { $slice: ["$root", 1] }
},
{
is_too_long: false,
docs: "$root"
}
]
}
}
},
{
$project: {
root: {
$map: {
input: "$root.docs",
in: { $mergeObjects: ["$$this", { is_too_long: "$root.is_too_long" }] }
}
}
}
},
{ $unwind: "$root" },
{ $replaceRoot: { newRoot: "$root" } }
]
}
},
{ $project: { root: { $concatArrays: ["$private", "$group"] } } },
{ $unwind: "$root" },
{ $replaceRoot: { newRoot: "$root" } }
])https://stackoverflow.com/questions/66076492
复制相似问题