如果MongoDB中仅满足特定条件,则分组
如果组事件数超过3,我想按其如果MongoDB中仅满足特定条件,则分组,mongodb,mongoose,group-by,aggregation-framework,Mongodb,Mongoose,Group By,Aggregation Framework,如果组事件数超过3,我想按其pid(仅组)对一些特定记录进行分组 示例: 此处组(pid:200)的事件数为4,必须分组 -事件- ---------- {{u id:ObjectId,类型:'private',pid:140,数据:{…}, {{u id:ObjectId,类型:'group',pid:800,数据:{…},// $facet用于分离私人和组文档 $groupbypid并将文档分组到一个数组中 $cond如果分组文档大于或等于3,则检查条件,然后从数组中分割单个元素,并设置过长
pid
(仅组)对一些特定记录进行分组
示例:
此处组(pid:200)
的事件数为4,必须分组
-事件-
----------
{{u id:ObjectId,类型:'private',pid:140,数据:{…},
{{u id:ObjectId,类型:'group',pid:800,数据:{…},//
$facet
用于分离私人
和组
文档
$group
bypid
并将文档分组到一个数组中
$cond
如果分组文档大于或等于3,则检查条件,然后从数组中分割单个元素,并设置过长:true
否则为false
$map
迭代文档的循环
数组和put布尔属性太长
$unwind
解构root
数组
$replaceRoot
将根对象替换为根对象
$concatarray
、concatprivate
和group
数组
$unwind
解构root
数组
$replaceRoot
替换根目录中的root
对象
- 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},
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" } }
])