【问题标题】:Mongodb aggregation array partition and countMongodb聚合数组分区和计数
【发布时间】:2021-09-10 06:46:16
【问题描述】:

我有一个无法解决的 mongodb 聚合问题。到目前为止,在我的聚合中,我有一个过滤器、一个 $project 和一个 $accumulator 使用 javascript 函数,该函数已设法将我拥有的数据减少到一个数组数组,例如这:[[A, B], [A, C], [A,B, [C, D], ...]。这些值 AB 等...是具有 4 或 5 个代表人的键和值的对象,而 [A, B]对人与人之间的表示关系。这个列表很长,在某些(甚至不是很大)查询中,生成 BSON 以返回的 16MB 的 mongodb 限制已达到。

我可以使用 $setIntersection 来减小列表的大小以使其正常工作,但我真正想做的是将列表减少为其中包含的唯一值以及计数每个独特的价值。这可以用几种方式表示,但为了说明这一点,我可能想要这个结构:[[[A, B], 2], [[A, C], 1], [[C, D], 1]], ...].

这里有人对我如何做到这一点有任何建议吗?我已经尝试了几件事,但还没有任何效果。如果我的 mongo (4.4.1) 中的 javascript 实现了对象散列和集合,那么我可以在我的累加器中轻松完成;但事实并非如此。我想我可以编写自己的 hash/set 实现,但这似乎有点矫枉过正。我还没有设法找到使用聚合管道运算符的机制。我认为这将是最好的做法,但我不确定......

根据此处的要求,提供有关数据的更多详细信息。 filter阶段返回的数据是这样的(显然很概括,Bob、Mark等都是对象):

[
  {
    …
    users: [
      Bob,
      Mary.
      Mark
    ] 
    …
  },
  {
    …
    users: [
      Andrew,
      Mary,
      Mark
    ] 
    …
  }.
  {
    …
    users: [
      Bob,
      Mark
    ] 
    …
  }
]

处理的第一阶段(我在 $Accumulator 中完成)是,对于每条记录,获取所有用户 A -> 用户 B 关系对,如下所示 (每条记录一行):

[
  [Bob, Mary], [Bob, Mark], [Mary, Bob], [Mary, Mark], [Mark, Bob], [Mark, Mary],
  [Andrew, Mary], [Andrew, Mark], [Mary, Andrew], [Mary, Mark], [Mark, Andrew], [Mark, Mary],
  [Bob, Mark], [Mark, Bob]
]

但是这个列表变得很长。我想通过找到唯一的对并计算它们来进行总结,以获得类似的东西。好的,我已经把它写成数组,但它可以采用具有相同含义的任何其他形式:

[
  [[Bob, Mary], 1],
  [[Bob, Mark], 2],
  [[Mary, Bob], 1],
  [[Mary, Mark], 2],
  [[Mark, Bob], 2],
  [[Mark, Mary], 2],
  [[Andrew, Mary], 1],
  [[Andrew, Mark], 1],
  [[Mary, Andrew], 1],
  [[Mark, Andrew], 1],
]

我希望这可以澄清事情。当然,我的做法可能有完全不同的方法。我愿意接受任何最有效的方法!

【问题讨论】:

    标签: mongodb aggregation-framework


    【解决方案1】:
    • $setUnion 从该数组中获取唯一元素
    • $map 迭代上述独特元素的循环
    • $filter 迭代数组循环并获取匹配元素
    • $size 超过过滤结果计数
    db.collection.aggregate([
      {
        $project: {
          field: {
            $map: {
              input: { $setUnion: "$field" },
              in: [
                "$$this",
                {
                  $size: {
                    $filter: {
                      input: "$field",
                      as: "a",
                      cond: { $eq: ["$$this", "$$a"] }
                    }
                  }
                }
              ]
            }
          }
        }
      }
    ])
    

    Playground

    【讨论】:

      猜你喜欢
      • 2013-11-23
      • 2018-08-17
      • 2020-11-09
      • 2014-02-27
      • 2016-12-25
      • 2015-02-14
      • 1970-01-01
      • 2013-01-12
      • 1970-01-01
      相关资源
      最近更新 更多