簡體   English   中英

嵌套的 Mongo DB 查詢

[英]Nested Mongo DB Query

我想計算利潤,我需要獲取 Item JsonArray 這是其他嵌套 JsonArray Order 的一部分

要獲取訂單數組對象,我們可以使用此查詢

var mapProfit=function(){for(var i in this.order)emit(this.order[i],1)}
var redProfit=function(k,v){return Array.sum(v)}
db.OnlineGrocery.mapReduce(mapProfit,redProfit,{out:"Result"}).find()

如何使用此查詢來獲取項目

{ 
    "_id" : ObjectId("605ac4dcf77f914c2aab81b0"), 
    "customer_id" : NumberInt(1), 
    "customer_firstName" : "Lannie", 
    "customer_lastName" : "Chazerand", 
    "customer_email" : "lchazerand0@usnews.com", 
    "customer_phoneNumber" : "3862602788", 
    "address" : [
        {
            "street" : "00523 Helena Plaza", 
            "city" : "Cincinnati", 
            "province" : "Ohio"
        }
    ], 
    "order" : [
        {
            "order_id" : "98-037-3943", 
            "order_date" : "6/22/2020", 
            "item" : [
                {
                    "item_id" : NumberInt(1), 
                    "item_name" : "Appetizer - Mango Chevre", 
                    "item_desc" : "Nondisp fx of pisiform, unsp wrist, init for clos fx", 
                    "item_qty" : NumberInt(5), 
                    "item_actual_price" : "$2.78", 
                    "item_selling_price" : "$8.23"
                }, 
                {
                    "item_id" : NumberInt(2), 
                    "item_name" : "Pork - Bacon,back Peameal", 
                    "item_desc" : "Other cervical disc disorders at C6-C7 level", 
                    "item_qty" : NumberInt(2), 
                    "item_actual_price" : "$1.53", 
                    "item_selling_price" : "$6.71"
                }
         ]
    }]
}

您可以使用點或括號表示法訪問 JSON 對象,但由於 order 屬性包含對象數組,因此您必須先訪問數組索引,然后才能訪問數組內的 object 屬性。 在這種情況下,它看起來像 order[index0].item[selectedItemIndex].item_qty/anyOtherItemProperty

希望這會有所幫助,否則請提供有關您的問題的更多詳細信息。

MapReduce 可能不是您計算利潤所需的工具。

要獲得整體利潤,您可以簡單地展開訂單和項目,然后總結:

db.collection.aggregate([
  {$unwind: "$order"},
  {$unwind: "$order.item"},
  {$group: {
      _id: null,
      profit: {
        $sum: {
          $subtract: [
            {$toDecimal: {
                $trim: {
                  chars: {$literal: "$"},
                  input: "$order.item.item_selling_price", 
                }
            }},
            {$toDecimal: {
                $ltrim: {
                  input: "$order.item.item_actual_price",
                  chars: {$literal: "$"}
                }
            }}
          ]
        }
      }
  }}
])

操場

或者,如果您需要按商品或按訂單獲利,則需要幾個小組階段:

db.collection.aggregate([
  {$unwind: "$order"},
  {$unwind: "$order.item"},
  {$addFields: {
      "order.item.profit": {
        $subtract: [
            {$toDecimal: {
              $trim: {
                chars: {$literal: "$"},
                input: "$order.item.item_selling_price", 
              }
            }},
            {$toDecimal: {
              $ltrim: {
                input: "$order.item.item_actual_price",
                chars: {$literal: "$"}
              }
            }}
        ]
      }
  }},
  {$group: {
      _id: {
        _id: "$_id",
        order: "$order.order_id"
      },
      root: {$first: "$$ROOT"},
      items: {$push: "$order.item"},
      profit: {$sum: "$order.item.profit"}
  }},
  {$addFields: {
      "root.order.item": "$items",
      "root.order.profit": "$profit"
  }},
  {$replaceRoot: {newRoot: "$root"}},
  {$group: {
      _id: "$_id",
      root: {$first: "$$ROOT"},
      orders: {$push: "$order"}
   }},
  {$addFields: {"root.order": "$orders"}},
  {$replaceRoot: {newRoot: "$root"}}
])

操場

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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