gpt4 book ai didi

mongodb - Mongo 查询从数组中查找畅销商品

转载 作者:可可西里 更新时间:2023-11-01 09:45:21 25 4
gpt4 key购买 nike

我是 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”销售的前 5 个“ol_i_id”报告回来:531。

我尽量使它易于理解。

/编辑到目前为止,我有这个。

 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 购买的所有订单行。现在我需要对每个唯一 ol_i_id 的 ol_qty 字段求和并返回前 5 个。这类似于您可能会做的事情在亚马逊上看到它说“买了这个的人也买了另一个东西”希望这更有意义。很抱歉在这方面过于冗长。

理想情况下,我希望它能以这样的一组回来

 {
"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
}

/edit 我现在想出了这个,这几乎是我需要的。

 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。

最佳答案

您自己得到了大部分答案,基本上有两种方法可以排除您查询时所基于的原始项目。一种是简单地将 {$match:{_id:{$ne:origID}}} 添加到管道的末尾。不要忘记将 $limit:5 更改为 $limit:6,因为您希望在排除项目本身后剩下五个项目。

一种更简单的方法是在管道中更早的时候添加相同的 {$match} - 特别是在 $unwind 之后。整个管道(经过一些简化)应如下所示:

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

关于mongodb - Mongo 查询从数组中查找畅销商品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18218324/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com