如何使用聚合在一个mongo文档中独立对多个数组进行排序

Vee

经过一些汇总后,我只有一个这样的文档:

{
  a:[3,5,8,1,...],
  b:[5,2,6,5,...],
  c:[2,6,3,1,...]
}

最好的获取方法是:

{
  a:[1,2,3,4,...],
  b:[1,2,3,4,...],
  c:[1,2,3,4,...]
}

我需要对它进行排序以进行其他聚合,因此不能使用findor update

Gytis TG

我得到的最接近的有效解决方案是以下聚合:

[
  {
    $facet: {
      a: [
        { $unwind: '$a' },
        { $sort: { a: 1 } },
        {
          $group: {
            _id: '$_id',
            a: { $push: '$a' }
          }
        }
      ],
      b: [
        { $unwind: '$b' },
        { $sort: { b: 1 } },
        {
          $group: {
            _id: '$_id',
            b: { $push: '$b' }
          }
        }
      ],
      c: [
        { $unwind: '$c' },
        { $sort: { c: 1 } },
        {
          $group: {
            _id: '$_id',
            c: { $push: '$c' }
          }
        }
      ]
    }
  },
  {
    $set: {
      a: { $arrayElemAt: ['$a.a', 0] },
      b: { $arrayElemAt: ['$b.b', 0] },
      c: { $arrayElemAt: ['$c.c', 0] }
    }
  }
]

简而言之,这样做是:$facet在每个执行相同的操作abc在平行场; 每个字段均以分隔$unwind,并按升序排序,然后对其进行分组。

到目前为止,我们已经对字段进行了排序,但是每个字段现在都是具有适当名称(例如{ _id: '', a: [...] })的对象。因此,要返回到我们前面的数组,另一阶段是仅从每个对象中仅提取所需的字段。这是通过$set$arrayElemAt(需要第一个数组字段)完成的。因此,最后,我们将每个字段以升序排序,同时拥有相同数量的文档。

注意:仅当您有一个结果文档时,此方法才有效。如果其中有多个,则需要稍微更改阶段:

  • $facet 阶段保持不变
  • 更新$set(第二)阶段更改为:

使用$unwind+更新$set为每个单独场阶段(在这种情况下,我们有abc):

{ $unwind: '$a' },
{ $unwind: '$b' },
{ $unwind: '$c' },
{ $set: { a: '$a.a' } },
{ $set: { b: '$b.b' } },
{ $set: { c: '$c.c' } }

这可能不是最漂亮的方法,但是我找不到较短的版本。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

mongo聚合-一个数组中的字段也位于另一个数组中的文档数

来自分类Dev

如何根据另一个数组的排序顺序对多个数组进行排序

来自分类Dev

如何在PHP中对一个数组进行排序并使用键顺序对第二个数组进行排序?

来自分类Dev

如何在PHP中对一个数组进行排序并使用键顺序对第二个数组进行排序?

来自分类Dev

如何在MATLAB中对一个数组进行排序并使用命令对第二个数组进行排序

来自分类Dev

如何根据Java中另一个数组的值对一个数组进行排序?

来自分类Dev

根据另一个数组的排序顺序对多个数组进行排序

来自分类Dev

根据另一个数组的排序顺序对多个数组进行排序

来自分类Dev

如何使用聚合在猫鼬中对文档数组进行分页?

来自分类Dev

使用聚合在每个文档mongodb中增加或减去一个字段

来自分类Dev

如何使用另一个数组作为参考对对象数组进行排序?

来自分类Dev

如何使用另一个数组作为模板对数组数据进行排序?

来自分类Dev

如何使用json.dump将多个数组转储到一个文档中?

来自分类Dev

如何在C ++中对一个数组进行排序并获取对应的第二个数组?

来自分类Dev

如何使用Ruby对另一个数组进行排序

来自分类Dev

如何从php中的另一个数组排序一个数组?

来自分类Dev

如何根据另一个数组的排序方式对一个数组进行排序?(JavaScript)

来自分类Dev

根据另一个数组中定义的排序顺序对数组进行排序

来自分类Dev

如何使用`update`将一个新元素推入mongo文档内的数组中?

来自分类Dev

根据另一个数组中的数据对一个数组进行排序

来自分类Dev

对一个数组进行排序比较 PHP 中的另一个数组

来自分类Dev

使用JavaScript根据另一个数组对一个数组进行排序

来自分类Dev

使用比较器无法根据另一个数组对一个数组进行排序

来自分类Dev

根据另一个数组中的顺序对数组数组进行排序

来自分类Dev

使用数组对对象进行排序并将值存储在另一个数组中

来自分类Dev

使用Python在一个数据框内进行多个分组和聚合

来自分类Dev

如何使用猫鼬聚合获取嵌套在另一个数组中的数组大小

来自分类Dev

对 ReactJs 中另一个数组中的数组进行排序

来自分类Dev

如何使用LINQ to MongoDb在文档中另一个数组内部的数组中查找和推送元素

Related 相关文章

  1. 1

    mongo聚合-一个数组中的字段也位于另一个数组中的文档数

  2. 2

    如何根据另一个数组的排序顺序对多个数组进行排序

  3. 3

    如何在PHP中对一个数组进行排序并使用键顺序对第二个数组进行排序?

  4. 4

    如何在PHP中对一个数组进行排序并使用键顺序对第二个数组进行排序?

  5. 5

    如何在MATLAB中对一个数组进行排序并使用命令对第二个数组进行排序

  6. 6

    如何根据Java中另一个数组的值对一个数组进行排序?

  7. 7

    根据另一个数组的排序顺序对多个数组进行排序

  8. 8

    根据另一个数组的排序顺序对多个数组进行排序

  9. 9

    如何使用聚合在猫鼬中对文档数组进行分页?

  10. 10

    使用聚合在每个文档mongodb中增加或减去一个字段

  11. 11

    如何使用另一个数组作为参考对对象数组进行排序?

  12. 12

    如何使用另一个数组作为模板对数组数据进行排序?

  13. 13

    如何使用json.dump将多个数组转储到一个文档中?

  14. 14

    如何在C ++中对一个数组进行排序并获取对应的第二个数组?

  15. 15

    如何使用Ruby对另一个数组进行排序

  16. 16

    如何从php中的另一个数组排序一个数组?

  17. 17

    如何根据另一个数组的排序方式对一个数组进行排序?(JavaScript)

  18. 18

    根据另一个数组中定义的排序顺序对数组进行排序

  19. 19

    如何使用`update`将一个新元素推入mongo文档内的数组中?

  20. 20

    根据另一个数组中的数据对一个数组进行排序

  21. 21

    对一个数组进行排序比较 PHP 中的另一个数组

  22. 22

    使用JavaScript根据另一个数组对一个数组进行排序

  23. 23

    使用比较器无法根据另一个数组对一个数组进行排序

  24. 24

    根据另一个数组中的顺序对数组数组进行排序

  25. 25

    使用数组对对象进行排序并将值存储在另一个数组中

  26. 26

    使用Python在一个数据框内进行多个分组和聚合

  27. 27

    如何使用猫鼬聚合获取嵌套在另一个数组中的数组大小

  28. 28

    对 ReactJs 中另一个数组中的数组进行排序

  29. 29

    如何使用LINQ to MongoDb在文档中另一个数组内部的数组中查找和推送元素

热门标签

归档