如果仅在 MongoDB 中满足特定条件,则分组
Posted
技术标签:
【中文标题】如果仅在 MongoDB 中满足特定条件,则分组【英文标题】:Group if only specific condition fulfil in MongoDB 【发布时间】:2021-05-10 13:48:37 【问题描述】:如果组事件的数量超过 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,
我尝试了其他一些查询,但都没有成功!请帮帮我!
【问题讨论】:
【参考方案1】:$facet
将 private
和 group
文件分开,
$group
by pid
并将文档分组到一个数组中
$cond
检查条件,如果分组文档大于或等于 3,则从数组中切片单个元素并设置 is_too_long: true
否则为 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"
])
Playground
【讨论】:
以上是关于如果仅在 MongoDB 中满足特定条件,则分组的主要内容,如果未能解决你的问题,请参考以下文章