如果仅在 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】: $facetprivategroup 文件分开, $group by pid 并将文档分组到一个数组中 $cond 检查条件,如果分组文档大于或等于 3,则从数组中切片单个元素并设置 is_too_long: true 否则为 false $map 迭代 docs 数组的循环并放入布尔属性 is_too_long $unwind解构root数组 $replaceRootroot 对象替换为根 $concatArrays、concat privategroup 数组 $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 中满足特定条件,则分组的主要内容,如果未能解决你的问题,请参考以下文章

如何仅在特定条件下执行 MongoDB 聚合阶段之一?

Pandas:如果特定列满足特定条件,则选择行

仅在满足条件时使用提示

WCF 仅在满足特定条件时调用方法,否则等待

如果在 Select-Query 中满足特定条件,则创建唯一标识符

MySQL存储过程——一一检查是不是满足某些条件;如果不满足,则退出程序并返回特定消息