【问题标题】:MongoDB aggregation like faceted searchMongoDB 聚合,如分面搜索
【发布时间】:2015-10-21 19:38:33
【问题描述】:

以集合为例:

db.products.insert([
    {"product_name": "Product 1", "filters": [{"name": "brand", "value": "Brand 1"}, {"name": "color", "value": "Color 1"}]},
    {"product_name": "Product 2", "filters": [{"name": "brand", "value": "Brand 2"}, {"name": "color", "value": "Color 2"}]},
    {"product_name": "Product 3", "filters": [{"name": "brand", "value": "Brand 1"}, {"name": "color", "value": "Color 2"}]},
    {"product_name": "Product 4", "filters": [{"name": "brand", "value": "Brand 3"}, {"name": "color", "value": "Color 1"}]},
    {"product_name": "Product 5", "filters": [{"name": "brand", "value": "Brand 3"}, {"name": "color", "value": "Color 3"}]}
])

如果必须汇总字典列表并获取每个字典的分组计数,如下所示:

(品牌)
品牌 1 : 2
品牌 2 : 1
品牌3:2

(颜色)
颜色 1 : 2
颜色 2 : 2
颜色 3 : 3

获取此信息的相关方法可能是什么?

【问题讨论】:

标签: mongodb facet faceted-search


【解决方案1】:

如下使用这个聚合:

db.products.aggregate({
  "$unwind": "$filters"
}, {
  "$group": {
    "_id": {
      "value": "$filters.value",
      "name": "$filters.name"
    },
    "count": {
      "$sum": 1
    }
  }
}, {
  "$group": {
    "_id": "$_id.name",
    "data": {
      "$push": {
        "value": "$_id.value",
        "totalCount": "$count"
      }
    }
  }
}).pretty()

【讨论】:

  • 这完全符合我的原始查询!关于如何使用上面相同的数据获得多选的任何想法,如 solr wiki.apache.org/solr/…
【解决方案2】:

您必须 unwind 您的数据才能获得平面数据集,而不是 group 通过过滤器值。

db.products.aggregate(
{
    $unwind: "$filters",
}, {
    $group: { 
        _id: "$filters.value",
        product_names: { $push: "$product_name" } ,
        count: { $sum: 1 }
    }
});

退货

{
    "result" : [ 
        {
            "_id" : "Color 3",
            "product_names" : [ 
                "Product 5"
            ],
            "count" : 1
        }, 
        {
            "_id" : "Brand 3",
            "product_names" : [ 
                "Product 4", 
                "Product 5"
            ],
            "count" : 2
        }, 
        {
            "_id" : "Color 2",
            "product_names" : [ 
                "Product 2", 
                "Product 3"
            ],
            "count" : 2
        }, 
        {
            "_id" : "Color 1",
            "product_names" : [ 
                "Product 1", 
                "Product 4"
            ],
            "count" : 2
        }, 
        {
            "_id" : "Brand 2",
            "product_names" : [ 
                "Product 2"
            ],
            "count" : 1
        }, 
        {
            "_id" : "Brand 1",
            "product_names" : [ 
                "Product 1", 
                "Product 3"
            ],
            "count" : 2
        }
    ],
    "ok" : 1
}

【讨论】:

    猜你喜欢
    • 2016-02-16
    • 2019-11-25
    • 1970-01-01
    • 1970-01-01
    • 2017-04-24
    • 1970-01-01
    • 2014-06-08
    • 2016-04-21
    • 2012-01-31
    相关资源
    最近更新 更多