Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果MongoDB中仅满足特定条件,则分组_Mongodb_Mongoose_Group By_Aggregation Framework - Fatal编程技术网

如果MongoDB中仅满足特定条件,则分组

如果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,则检查条件,然后从数组中分割单个元素,并设置过长

如果组事件数超过3,我想按其
pid
(仅组)对一些特定记录进行分组

示例:

此处
组(pid:200)
的事件数为4,必须分组

-事件-
----------
{{u id:ObjectId,类型:'private',pid:140,数据:{…},
{{u id:ObjectId,类型:'group',pid:800,数据:{…},//
  • $facet
    用于分离
    私人
    文档
  • $group
    by
    pid
    并将文档分组到一个数组中
  • $cond
    如果分组文档大于或等于3,则检查条件,然后从数组中分割单个元素,并设置
    过长:true
    否则为false
  • $map
    迭代
    文档的循环
    数组和put布尔属性
    太长
  • $unwind
    解构
    root
    数组
  • $replaceRoot
    根对象替换为根对象
  • $concatarray
    、concat
    private
    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" } }
])