3

私は Mongo を初めて使用するので、このクエリの書き方がわかりません。このような注文コレクションがあります。

{
"_id" : ObjectId("51fade5b8c825bb19d9ef228"),
"o_id" : 1,
...
"order_line" : [
    {
            "ol_id" : 1,
            "ol_o_id" : 1,
            "ol_i_id" : 531,
            "ol_qty" : 280
    },
    {
            "ol_id" : 2,
            "ol_o_id" : 1,
            "ol_i_id" : 90,
            "ol_qty" : 295
    },
    {
            "ol_id" : 3,
            "ol_o_id" : 1,
            "ol_i_id" : 963,
            "ol_qty" : 184
    }
]}

各商品の最も売れている関連商品を見つける必要があります。

クエリは、現在クエリされている ol_i_id で販売されている上位 5 つのアイテム/ol_i_id を見つける必要があります。これを行うには、クエリで問題の「ol_i_id」を持つすべての注文を検索する必要があります。たとえば、「ol_i_id」: 531 とし、コレクション全体で「ol_i_id」: 531 で販売された各アイテムの「ol_qty」を合計します。次に、"ol_i_id":531 で販売されている上位 5 つの "ol_i_id" でレポートを返します。

私はそれをできるだけ理解できるようにしようとしました。

/編集これまでのところ、これがあります。

 db.orders.aggregate( { $match : { order_line: { $elemMatch : { ol_i_id : 531 } } } },
   { $project : { o_id : 1, order_line : 1} },
   { $unwind: "$order_line"},
   { $limit : 5 } )

order_line を巻き戻すと、次のようになります。

   "result" : [
           {
                   "_id" : ObjectId("51fade5b8c825bb19d9ef389
                   "o_id" : 354,
                   "order_line" : {
                           "ol_id" : 1,
                           "ol_o_id" : 354,
                           "ol_i_id" : 2,
                           "ol_qty" : 271
                   }
           },
           {
                   "_id" : ObjectId("51fade5b8c825bb19d9ef389
                   "o_id" : 354,
                   "order_line" : {
                           "ol_id" : 2,
                           "ol_o_id" : 354,
                           "ol_i_id" : 707,
                           "ol_qty" : 138
                   }
           }...

そのクエリは、問題の ol_i_id である 531 で購入したすべての order_lines を教えてくれました。ここで、一意の ol_i_id ごとに ol_qty フィールドを合計し、上位 5 を返す必要があります。これは、Amazon で見られるものと似ています。 「これを購入した人は、この別のものも購入しました」と書かれているところが、より理にかなっていることを願っています。これについて過度に冗長で申し訳ありません。

理想的には、このようなセットで戻ってくることを望みます

 {
    "result" : [
            {
                    "ol_i_id" : 46,
                    "totalSoldWithItem531" : 20012
            },
            {
                    "ol_i_id" : 669,
                    "totalSoldWithItem531" : 19000
            },
            {
                    "ol_i_id" : 5,
                    "totalSoldWithItem531" : 18291
            },
            {
                    "ol_i_id" : 881,
                    "totalSoldWithItem531" : 18101
            },
            {
                    "ol_i_id" : 538,
                    "totalSoldWithItem531" : 17001
            }
    ],
    "ok" : 1
}

/編集これを思いついたので、これはほとんど必要なものです。

 db.orders.aggregate( { $match : { order_line: { $elemMatch : { ol_i_id : 531 } } } },
    { $project : { o_id : 1, order_line : 1} },
    { $unwind: "$order_line"},
    { $group : { _id : "$order_line.ol_i_id", 
     totalSales : { $sum : "$order_line.ol_qty" } } },
    { $sort : { totalSales : -1 } },
    { $limit : 5 } )

結果はこんな感じ。

 {
    "result" : [
            {
                    "_id" : 531,
                    "totalSales" : 10639
            },
            {
                    "_id" : 655,
                    "totalSales" : 520
            },
            {
                    "_id" : 2,
                    "totalSales" : 500
            },
             ....

私の最後の問題は、その数字には興味がないので、クエリされたアイテムを結果セットから除外するにはどうすればよいですか? この場合、_id : 531 は照会された ID であるため、結果から除外する必要があります。

4

1 に答える 1