首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果在MongoDB中只满足特定条件的话

如果在MongoDB中只满足特定条件的话
EN

Stack Overflow用户
提问于 2021-02-06 11:42:47
回答 1查看 290关注 0票数 3

如果组事件的数量超过3个,我想通过它们的pid (仅组)对某些特定记录进行分组。

示例:

这里,group (pid: 200)的事件数为4,必须分组。

代码语言:javascript
复制
- 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)没有按预期进行分组。

代码语言:javascript
复制
- 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},

我尝试了一些其他的查询,但都没有用!请帮帮我!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-02-06 12:36:39

  • $facet来分离privategroup文档,
  • 数组中的$grouppid和group文档组成
  • 如果分组文档大于或等于3,则从数组中分割单个元素,并设置$cond,否则为false
  • $map迭代docs数组的循环并放置布尔属性is_too_long
  • $unwind解构root阵列
  • $replaceRootroot对象替换为根
  • $concatArrays、concat privategroup数组
  • $unwind解构root阵列
  • $replaceRoot替换根目录中的root对象
代码语言:javascript
复制
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" } }
])

游乐场

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66076492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档