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