[英]Mongodb aggregation or projection
{ "items": [ { "id": "5bb619e49593e5d3cbaa0b52", "name": "Flowers", "weight": "1.5" }, { "id": "5bb619e4ebdccb9218aa9dcb", "name": "Chair", "weight": "8.4" }, { "id": "5bb619e4911037797edae511", "name": "TV", "weight": "20.8" }, { "id": "5bb619e4504f248e1be543d3", "name": "Skateboard", "weight": "5.9" }, { "id": "5bb619e40fee29e3aaf09759", "name": "Donald Trump statue", "weight": "18.4" }, { "id": "5bb619e44251009d72e458b9", "name": "Molkkÿ game", "weight": "17.9" }, { "id": "5bb619e439d3e99e2e25848d", "name": "Helmet", "weight": "22.7" } ] }
我有這種結構的模型。 我想計算每個訂單的重量。 我應該使用聚合還是有人有任何想法?
這是訂單的示例:
{
"id": "5bb61dfd4d64747dd8d7d6cf",
"date": "Sat Aug 11 2018 02:01:25 GMT+0000 (UTC)",
"items": [
{
"item_id": "5bb619e44251009d72e458b9",
"quantity": 4
},
{
"item_id": "5bb619e4504f248e1be543d3",
"quantity": 2
},
{
"item_id": "5bb619e40fee29e3aaf09759",
"quantity": 3
}
]
}
您在這里有兩個選擇,而無需更改模型結構:
Parcel
使用的所有項目 $lookup
)在數據庫端執行所有計算 這很大程度上取決於您的實際數據模型和數據集大小。 第一種選擇非常簡單明了,在大型數據集上可能表現得更好,尤其是在涉及分片/副本集時。 但是它需要更多的數據庫往返,這將帶來更多的延遲。 另一方面,在某些情況下,聚合在查找時可能會非常慢。 但是唯一的好方法是對您的真實數據進行測試。 如果您當前的數據集很小(例如100 Mb),請選擇您喜歡的方式-兩者都將非常有用。
更新
由於您需要將Orders
分發到Parcels
我仍然希望選擇選項1,盡管仍然可以使用匯總。
這就是我要做的:
Order
Order.items
找到的ID從數據庫中提取所有相關Items
Order
重量的計算 Parcel
,並將其保存到數據庫中 Parcels
某種方式將Items
分發到Parcels
並將其保存到數據庫 請注意,您可以在一個調用中通過如下查詢通過其ID提取多個Items
:
{
_id: { $in: [<id1>, <id2>] }
}
還有另一件事要考慮。 請注意MongoDB沒有事務或多文檔原子性這一事實。 因此,使用模式定義的顯示方式執行這種類型的操作(從數據庫中抽取內容,執行計算並存儲回去)會導致創建重復項。
您可以使用以下aggregation
db.order.aggregate([
{ "$unwind": "$items" },
{ "$lookup": {
"from": "items",
"localField": "items.item_id",
"foreignField": "id",
"as": "item"
}},
{ "$unwind": "$item" },
{ "$addFields": { "items.weight": "$item.weight" }},
{ "$group": {
"_id": "$_id",
"items": { "$push": "$items" },
"date": { "$first": "$date" }
}}
])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.