Mongo查询从订单列表中查找***商店
Posted
技术标签:
【中文标题】Mongo查询从订单列表中查找***商店【英文标题】:Mongo query to find top store from list of orders 【发布时间】:2021-12-17 14:00:46 【问题描述】:我对 Mongo 还是很陌生。我有两个集合,如下所示。
订单收集
[
id: 1,
price: 249,
store: 1,
status: true
,
id: 2,
price: 230,
store: 1,
status: true
,
id: 3,
price: 240,
store: 1,
status: true
,
id: 4,
price: 100,
store: 2,
status: true
,
id: 5,
price: 150,
store: 2,
status: true
,
id: 6,
price: 500,
store: 3,
status: true
,
id: 7,
price: 70,
store: 4,
status: true
,
]
商店收藏
[
id: 1,
name: "Store A",
status: true
,
id: 2,
name: "Store B",
status: true
,
id: 3,
name: "Store C",
status: true
,
id: 4,
name: "Store D",
status: false
]
如何从订单列表中找到排名靠前的店铺,应该根据每家店铺的总销售额。
我尝试过以下方法
db.order.aggregate([
"$match":
status: true
,
"$group":
"_id": "$store",
"totalSale":
"$sum": "$price"
,
$sort:
totoalSale: -1
])
我从上面的 sn-ps 中得到了商店的排序列表。但我想在总销售额的同时添加商店详细信息。
更多:https://mongoplayground.net/p/V3UH1r6YRnS
预期输出
[
id: 1,
name: "Store A",
status: true,
totalSale: 719
,
id: 1,
name: "Store c",
status: true,
totalSale: 500
,
_id: 2,
id: 1,
name: "Store B",
status: true,
totalSale: 250
,
_id: 4,
name: "Store D",
status: true,
totalSale: 70
]
【问题讨论】:
【参考方案1】:$lookup
- store
集合加入 order
集合并生成新字段 store_orders
。
$set
- 使用来自store_orders
的status: true
过滤order
。
$set
- totalSale
store_orders.price
的字段总和。
$sort
- 按降序对totalSale
进行排序。
$unset
- 删除 store_orders
字段。
db.store.aggregate([
$lookup:
from: "order",
localField: "id",
foreignField: "store",
as: "store_orders"
,
$set:
"store_orders":
$filter:
input: "$store_orders",
as: "order",
cond:
$eq: [
"$$order.status",
true
]
,
$set:
"totalSale":
"$sum": "$store_orders.price"
,
$sort:
totalSale: -1
,
$unset: "store_orders"
])
Sample Mongo Playground
【讨论】:
【参考方案2】:你可以从store
集合、$lookup
order
集合、$sum
totalSales
开始,然后争吵到你想要的形式
db.store.aggregate([
"$lookup":
"from": "order",
let:
id: "$id"
,
pipeline: [
$match:
$expr:
$eq: [
"$$id",
"$store"
]
,
$group:
_id: null,
totalSale:
$sum: "$price"
],
"as": "totalSale"
,
$unwind: "$totalSale"
,
$addFields:
totalSale: "$totalSale.totalSale"
,
$sort:
totalSale: -1
])
这里是Mongo playground 供您参考。
【讨论】:
以上是关于Mongo查询从订单列表中查找***商店的主要内容,如果未能解决你的问题,请参考以下文章
如何通过 Laravel 中的 API 从 Shopify 商店获取所有订单