我正在尝试按照MongoDB集合中每个文档内的频率对一些数组进行排序。
目前我的文档大致如下:
注意:这不是真实的数据,但文档的属性是完全相同的。
最终目标是找到每种颜色中最常见的水果、蔬菜和肉类,所以我猜想如果我能按颜色分组,并按频率排序获取每个数组的第一个元素,那就能得到我所需的结果。
我尝试过展开(unwinding),但我的数据库太大了,无法为每个数组展开(每个数组大约有50,000个元素,所以50,000^3似乎不是理想的选择)。我还寻找了一个“mode”组函数,因为MongoDB有一个“median”函数,但似乎没有(v5.0.22)。我还研究了映射和归约函数用于流水线处理(db.collection.aggregate({$map //或 $reduce...})),但由于这对我来说还比较新,所以进展不大,尽管我觉得这可能是正确的方法。
有人做过类似的事情吗?或许在这里能起作用?谢谢!
目前我的文档大致如下:
{
"_id": whatever,
"color": "blue",
"fruit": ["apple", "banana", "apple", "orange", "apple", "orange", ...],
"vegetable": ["onion", "lettuce", "spinach", "lettuce", ...],
"meat": ["pulled pork", "steak", "chicken wings", "pulled pork", "pulled pork", ...]
}
注意:这不是真实的数据,但文档的属性是完全相同的。
最终目标是找到每种颜色中最常见的水果、蔬菜和肉类,所以我猜想如果我能按颜色分组,并按频率排序获取每个数组的第一个元素,那就能得到我所需的结果。
我尝试过展开(unwinding),但我的数据库太大了,无法为每个数组展开(每个数组大约有50,000个元素,所以50,000^3似乎不是理想的选择)。我还寻找了一个“mode”组函数,因为MongoDB有一个“median”函数,但似乎没有(v5.0.22)。我还研究了映射和归约函数用于流水线处理(db.collection.aggregate({$map //或 $reduce...})),但由于这对我来说还比较新,所以进展不大,尽管我觉得这可能是正确的方法。
有人做过类似的事情吗?或许在这里能起作用?谢谢!
颜色
是水果
的对等字段。另外:这里是超级聚合,不是优化索引获取或事务插入。在SPARK中运行并将数据转储到AWS S3是可能的吗? - undefinedcolor
字段已经从数组类型变为单值标量类型,因此可以采用新的方法处理。fruit
等字段是否仍然是长度为50000的数组?总共有多少个文档? - undefined$group
阶段了?可能是用$push
来收集fruit
、meat
等的标量值? - undefined