MongoDB 类别记录搜索结果


MongoDB category tallies of found set

我有一个产品系列。大多数产品都有一个类别,一个子类别和一个子子类别,有些只有其中的1或2个。我目前将它们存储在数组字段"类别"中,对于"书籍"类型的产品,它可能看起来像 ["德语"、"文学"、"小说"](大约有 15 种类型,每种都有自己的类别树(。
我想做的是进行搜索,也许有 10K 个匹配项,向浏览器返回 100,并显示一个包含查询找到计数的类别列表。我不知道预先的类别是什么,它们也可以改变。

我正在查看的不同方式:

  • MapReduce,但我听说这很"慢",比实时搜索更适合日常统计
  • 我得到的一个建议是聚合>$group:看看这个,但我看不出它如何计算值而不仅仅是求和或平均它们......我错过了什么吗?
  • 对所有产品进行第二次搜索,仅返回类别字段,以便我可以在生产代码中进行计数
  • 对每个类别进行循环搜索,只需返回光标的 count((。为此,我需要清楚地了解类别,这似乎是最后的手段。

基本上我的问题是"最好的方法是什么?",它应该相当快,并且可扩展。

当这起作用时,在用户单击某个类别后也是如此 - 然后应该统计该类别的子类别的结果,依此类推子类别(如果有(。

附加信息:该集合可能有几百万种产品,因为我们还没有数据,很难对其进行测试,目前只有大约 50K 种产品......未来的计划包括分片设置(除了"产品"之外还有很多其他数据(。
我是否以正确的方式存储类别,或者它们应该是单独的字段,这会有所帮助吗?现在数组中有 3 个项目,但以后可能会增加。
MongoDB的新手,到目前为止只在MySQL上工作了很多。


澄清类别;对于"书籍"类型的示例产品,"德语"将是主要类别,"文学"是子类别,"小说"是其子类别。其他主要类别是5-6种其他语言(书籍(,其他子类别是例如"学术与学习","商务"或"旅行与语言"。子类别取决于子类别(最后,SSC可以是"外语研究","社会语言学",..(。我将这三个存储在一个字段中,作为数组,每个产品。
当有人在"book"类型上搜索"foo"时,它会找到123个英文产品,456个德语产品,789个法语产品。我想要的是显示找到产品的所有主要(语言(类别的列表,以及找到的产品数量。
然后,当有人选择"德语"时,它将执行另一个查询,并按子类别显示找到的德语书籍的数量("学术与学习"中有44本,"商业"中有57本,...(。

我目前将它们存储在数组字段"类别"中,它可能看起来像 ["德语"、"文学"、"小说"]

您不应该对三个不同的字段使用一个数组,即"类别"、"子类别"和"子子类别"。

另外,为什么要将语言存储为类别而不是"语言"?在数据库的"模式"中添加一些逻辑,因为它会在事情变得更加复杂时为您提供帮助。

如果这样做,使用聚合(它比 hadoop 更快,并且在分片集群中是可能的(会容易得多,因为您不必在数组内部查询,并且可以获得更准确的结果。由于它们的值非常小,因此字段的名称("c"表示类别,"sc"表示子类别,"scc"表示子子类别(,如下所示:

{ _id : xxxxxxxxxxxx , name : "A novel of german literature" , c : "german", sc : "literature", ssc : "novels" }

我想做的是进行搜索,也许有 10K 个匹配项,向浏览器返回 100,并显示一个包含查询找到计数的类别列表。我不知道预先的类别是什么,它们也可以改变。

由于 mongo 是无模式的,因此您不必为每条记录设置所有这些字段。如果您计划在产品之间具有非常不同的架构,也许您应该为每个产品使用不同的集合,但这取决于您。

我想做的是进行搜索,也许有 10K 个匹配项,向浏览器返回 100,并显示一个包含查询找到计数的类别列表。我不知道预先的类别是什么,它们也可以改变。

充分利用索引(有很多种索引,您可能应该使用多个索引(,并使用带有$group和$limit的聚合来仅返回 100 条记录。

当这起作用时,在用户单击某个类别后也是如此 - 然后应该统计该类别的子类别的结果,依此类推子类别(如果有(。

下面是获取类别的所有子类别的示例查询(使用前面所述的架构(:

 db.products.aggregate([{ $match : { "c" : "german"}},{ $group : { _id : {"c" : "$c"}, $addToSet :{ "subcategories" : "$sc"}}}])

此查询将返回当前类别存在的所有子类别的数组。

(更新了查询,以防您的类别是数组而不是单个字符串(

 db.products.aggregate([{ $match : { "c" : {$elemMatch : {"german" : 1, "english" : 1}}}},{ $group : { _id : {"c" : "$c"}, $addToSet :{ "subcategories" : "$sc"}}}])