簡體   English   中英

Mongodb聚合或投影

[英]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
        }
      ]
    }

在此處輸入圖片說明

您在這里有兩個選擇,而無需更改模型結構:

  1. 從應用程序中的數據庫中提取Parcel使用的所有項目
  2. 使用聚合(和$lookup )在數據庫端執行所有計算

這很大程度上取決於您的實際數據模型和數據集大小。 第一種選擇非常簡單明了,在大型數據集上可能表現得更好,尤其是在涉及分片/副本集時。 但是它需要更多的數據庫往返,這將帶來更多的延遲。 另一方面,在某些情況下,聚合在查找時可能會非常慢。 但是唯一的好方法是對您的真實數據進行測試。 如果您當前的數據集很小(例如100 Mb),請選擇您喜歡的方式-兩者都將非常有用。

更新

由於您需要將Orders分發到Parcels我仍然希望選擇選項1,盡管仍然可以使用匯總。

這就是我要做的:

  1. 從數據庫中提取Order
  2. 通過在Order.items找到的ID從數據庫中提取所有相關Items
  3. 執行Order重量的計算
  4. 如果重量<30,則創建一個Parcel ,並將其保存到數據庫中
  5. 或者如果重量> 30, 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM