Mongoid:使用group by,distinct和count操作进行查询

时间:2014-12-17 22:25:03

标签: mongodb mongoid

假设我的ItemAvailability名称的模型有product_idvendor_idshop_id

我想在product_id上分组,并选择product_id有{count =>} = 3的所有distinct(vendor_id)

使用MongoID这是可行的吗?

示例数据:

ItemAvailability
product_id vendor_id shop_id
1              1        1
1              1        2
1              1        3
2              2        1
2              2        2
1              2        1
1              2        2
1              2        3
1              3        1
1              3        2

在上述数据集中,结果应为1,因为它在所有供应商1,2和3中都可用。

其中2不应该是结果,因为它仅由供应商2提供。

如果需要更多细节,请告诉我?

1 个答案:

答案 0 :(得分:5)

您可以使用aggregation framework在MongoDB中执行group by个查询。请查看docs以获取介绍。它非常强大,您可以通过查看示例来了解它。

对于您所描述的方案,以下查询应该有所帮助:

db.ItemAvailability.aggregate(
    [
        // Group By product_id, vendor_id
        {
            "$group": { _id: { product_id: "$product_id", vendor_id: "$vendor_id" } }
        },
        // Group results from above step by product_id and get the count
        {
            "$group": { _id: "$_id.product_id", count: { "$sum": 1 } }
        },
        // Filter the records for count >= 3
        {
            "$match": { count: { "$gte": 3 } }
        }
    ]
)