2017-08-03 42 views
0

我有秩序頭和位置(如數組)的集合,我需要一個查詢應該給我:如何計算在MongoDB彙總中展望頭寸的訂單?

  • 客戶的數量
  • 訂單
  • 總結了訂單價值

所有按日期和訂單類型分組。我已經得到了兩個查詢覆蓋(見下文),但我想在一個。 我面臨的主要問題是,我需要計算訂單,但需要平倉。

例如:下面是與下面的測試數據組合查詢的可能結果:

/* 1 */ 
{ 
     "_id" : { 
     "typ" : "WERBUNG", 
     "date" : "2017-07-08" 
    }, 
    "orderQuantity" : 1.0, 
    "value" : 1000, 
    "customerQuantity" : 1 
} 

/* 2 */ 
{ 
    "_id" : { 
     "typ" : "WERBUNG", 
     "date" : "2017-07-07" 
    }, 
    "orderQuantity" : 2.0, 
    "value" : 100, 
    "customerQuantity" : 1 
} 

/* 3 */ 
{ 
    "_id" : { 
     "typ" : "ANDERE", 
     "date" : "2017-07-08" 
    }, 
    "orderQuantity" : 4.0, 
    "value" : 1500, 
    "customerQuantity" : 4 
} 

/* 4 */ 
{ 
    "_id" : { 
     "typ" : "ANDERE", 
     "date" : "2017-07-07" 
    }, 
    "orderQuantity" : 1.0, 
    "value" : 90, 
    "customerQuantity" : 1 
} 

...這將意味着:

  • 在7-7那裏有3個數量級(2 WERBUNG,ANDERE 1)只有1個客戶(WERBUNG 1,ANDERE 1 - 將在這裏計算兩次,這一點會好起來的)
  • 在8-7那裏有5個數量級(WERBUNG 1,ANDERE 4)5客戶(WERBUNG 4,ANDERE 1)

我有一個想法,SortBy將有助於在這裏,但我們仍然使用3.2 - 所以這個階段沒有獲得(和其他一些有用的選項,以及...)。

乾杯!

- 有些信息可能有助於:

//這是來樣訂貨:

/*1*/ 
{ 
    "_id" : ObjectId("596075d5be8fc415341c7d43"), 
    "header" : { 
     "kundennummer" : "820130", 
     "auftragsdatum" : 0, 
     "bestellangaben" : "BLOCK1", 
     "information1" : "blocktest", 
     "erstellungsdatum" : 1499493785.25906, 
     "vorgabeauftragsnummer" : 87475000, 
    }, 
    "ordertype" : "BLOCK1", 
    "customernnummer" : "820130", 
    "ordernumber" : 87475000, 
    "positions" : [ 
      "artikelnummer" : 1985900, 
      "menge" : 1, 
      "bruttopreis" : 1000, 
      "_id" : ObjectId("596075d5be8fc415341c7d45") 
     } 
    ], 
    "date" : "2017-07-08", 
    "type" : "WERBUNG" 
} 
/*2*/ 
{ 
    "_id" : ObjectId("59608f64be8fc415341c7d46"), 
    "header" : { 
     "kundennummer" : "944867", 
     "auftragsdatum" : 0, 
     "bestellangaben" : "", 
     "information1" : "blocktest", 
     "erstellungsdatum" : 1499500356.10022, 
     "vorgabeauftragsnummer" : 87475001, 
    }, 
    "ordertype" : "", 
    "customernnummer" : "944867", 
    "ordernumber" : 87475001, 
    "positions" : [ 
     { 
      "artikelnummer" : 4029300, 
      "menge" : 1, 
      "bruttopreis" : 100, 
      "_id" : ObjectId("59608f64be8fc415341c7d5c") 
     } 
    ], 
    "date" : "2017-07-08", 
    "type" : "ANDERE" 
} 
/*3*/ 
{ 
    "_id" : ObjectId("5960925ebe8fc415341c7d5d"), 
    "header" : { 
     "kundennummer" : "981927", 
     "auftragsdatum" : 0, 
     "bestellangaben" : "", 
     "information1" : "blocktest", 
     "erstellungsdatum" : 1499501036.34265, 
     "vorgabeauftragsnummer" : 87475002, 
    }, 
    "ordertype" : "", 
    "customernnummer" : "981927", 
    "ordernumber" : 87475002, 
    "positions" : [ 
      }, 
      "artikelnummer" : 4557300, 
      "menge" : 2, 
      "bruttopreis" : 100, 
      "_id" : ObjectId("5960925ebe8fc415341c7d74") 
     } 
    ], 
    "date" : "2017-07-08", 
    "type" : "ANDERE" 
} 
/*4*/ 
{ 
    "_id" : ObjectId("5960925ebe8fc415341c7d75"), 
    "header" : { 
     "kundennummer" : "981927", 
     "auftragsdatum" : 0, 
     "bestellangaben" : "BLOCK2", 
     "information1" : "blocktest", 
     "erstellungsdatum" : 1499414714, 
     "vorgabeauftragsnummer" : 87475003, 
    }, 
    "ordertype" : "BLOCK2", 
    "customernnummer" : "981927", 
    "ordernumber" : 87475003, 
    "positions" : [ 
     { "artikelnummer" : 7081200, 
      "menge" : 3, 
      "bruttopreis" : 10, 
      "_id" : ObjectId("5960925ebe8fc415341c7d8f") 
     } 
    ], 
    "date" : "2017-07-07", 
    "type" : "WERBUNG" 
} 
/*5*/ 
{ 
    "_id" : ObjectId("596093ebbe8fc415341c7d90"), 
    "header" : { 
     "kundennummer" : "962422", 
     "auftragsdatum" : 0, 
     "bestellangaben" : "", 
     "information1" : "blocktest", 
     "erstellungsdatum" : 1499501507.75201, 
     "vorgabeauftragsnummer" : 87475004, 
    }, 
    "ordertype" : "", 
    "customernnummer" : "962422", 
    "ordernumber" : 87475004, 
    "positions" : [ 
      "artikelnummer" : 3545900, 
      "menge" : 4, 
      "bruttopreis" : 100, 
      "_id" : ObjectId("596093ebbe8fc415341c7d95") 
     } 
    ], 
    "date" : "2017-07-08", 
    "type" : "ANDERE" 
} 
/*6*/ 
{ 
    "_id" : ObjectId("596098e9be8fc415341c7ddf"), 
    "header" : { 
     "kundennummer" : "981927", 
     "auftragsdatum" : 0, 
     "bestellangaben" : "BLOCK3", 
     "information1" : "blocktest", 
     "erstellungsdatum" : 1499415886, 
     "vorgabeauftragsnummer" : 87475007, 
    }, 
    "ordertype" : "BLOCK3", 
    "customernnummer" : "981927", 
    "ordernumber" : 87475007, 
    "positions" : [ 
     { 
      "artikelnummer" : 1006199, 
      "menge" : 7, 
      "bruttopreis" : 10, 
      "_id" : ObjectId("596098e9be8fc415341c7de6") 
     } 
    ], 
    "date" : "2017-07-07", 
    "type" : "WERBUNG" 
} 
/*7*/ 
{ 
    "_id" : ObjectId("59609a47be8fc415341c7de7"), 
    "header" : { 
     "kundennummer" : "981225", 
     "auftragsdatum" : 0, 
     "bestellangaben" : "", 
     "information1" : "blocktest", 
     "erstellungsdatum" : 1499503113.21714, 
    }, 
    "ordertype" : "", 
    "customernnummer" : "981225", 
    "ordernumber" : 87475008, 
    "positions" : [ 
     { 
      "_id": ObjectId("59609a47be8fc415341c7e0d") 
      "artikelnummer" : 2308400, 
      "menge" : 8, 
      "bruttopreis" : 100, 
     } 
    ], 
    "date" : "2017-07-08", 
    "type" : "ANDERE" 
} 
/*8*/ 
{ 
    "_id" : ObjectId("59609a47be8fc415341c7e0e"), 
    "header" : { 
     "vorgabeauftragsnummer" : 87475009, 
     "erstellungsdatum" : 1499416697, 
     "information1" : "blocktest", 
     "bestellangaben" : "", 
     "auftragsdatum" : 0, 
     "kundennummer" : "981927", 
    }, 
    "ordertype" : "", 
    "customernnummer" : "981927", 
    "ordernumber" : 87475009, 
    "positions" : [ 
      "_id" : ObjectId("59609a47be8fc415341c7e57"), 
      "bruttopreis" : 10, 
      "menge" : 9, 
      "artikelnummer" : 8017000 
     } 
    ], 
    "date" : "2017-07-07", 
    "type" : "ANDERE" 
} 

//查詢1:客戶和訂單價值按訂單類型數量(WERBUNG,ANDERE )和天

db.getCollection('orders').aggregate([ 
{$unwind:"$positions"}, 
    {$project: { 
     "_id": 1, 
     customer: "$header.customernnummer", 
     date: {$}ToString: {format: "%d-%m-%Y", }: {"$add":[ new }(0), {"$multiply": [1000, "$header.erstellungsdate"]}]} }}, 
     edate: "$header.erstellungsdate", 
     ordertype: "$header.ordertype", 
     type: {$cond: { if: {$ne: ["$header.ordertype" ,""]} , then: "WERBUNG", else: "ANDERE" }}, 
     value: {$multiply: ["$positions.price","$positions.quantity"]}, 
     } 
    }, 
    {$group: { 
     _id: {type: "$type", tag: "$date",customer: "$customer" }, 
     type: {$first: "$type"}, 
     date: {$first: "$date"}, 
     wert: {$sum: "$value" } 
     } 
    }, 
    {$project:{ 
     _id : 0, 
     customer: "$customer", 
     type: "$type", 
     date: "$date", 
     wert: "$wert" 
     } 
    } 
    ,{$group: { 
     _id: {typ: "$type", date: "$date"}, customerQuantity:{$sum:1}, 
     value: {$sum: "$wert"} 
     } 
    }, 
    {$sort:{ 
     typ: 1, date: -1 
     } 
    } 
]} 

//查詢2:由類型訂單數量,日期

... 
{$project: { 
    block: {$cond: { if: {$ne: ["$auftragskopf.bestellangaben" ,""]} , then: "WERBUNG", else: "ANDERE" }}, 
    datum: {$dateToString: {format: "%d-%m-%Y", date: {"$add":[ new Date(0), {"$multiply": [1000, "$auftragskopf.erstellungsdatum"]}]} }}, 
    } 
}, 
{$group:{ 
    _id: {block: "$block", datum: "$datum"}, 
    auftragsanzahl:{$sum:1}, 
    } 
}, 

回答

0

我不知道你的數據的樣子,但我從這一行

type: {$cond: { if: {$ne: ["$header.ordertype" ,""]} , then: "WERBUNG", else: "ANDERE" }} 

明白,如果你$ header.ordertype是WERBUNG那麼你希望你的訂單類型爲WERBUNG,否則其ANDERE。考慮到這一點,這是我的解決方案。

db.getCollection('orders').aggregate([ 
    { 
     $project: { 
      "_id": 1, 
      header: 1, 
      positions: 1, 
      date: { 
       $dateToString: { 
        format: "%Y-%m-%d", 
        date: { 
         "$add": [new Date(0), { 
          "$multiply": [1000, "$header.date"] 
         }] 
        } 
       } 
      }, 
      type: { 
       $cond: { 
        if: { 
         $eq: ["$header.ordertype", "WERBUNG"] 
        }, 
        then: "WERBUNG", 
        else: "ANDERE" 
       } 
      } 
     } 
    }, 
    { 
     $group: { 
      _id: { 
       type: "$type", 
       date: "$date" 
      }, 
      werbungCount: { 
       $sum: { 
        $cond: [{ 
         $eq: ['$type', 'WERBUNG'] 
        }, 1, 0] 
       } 
      }, 
      andereCount: { 
       $sum: { 
        $cond: [{ 
         $eq: ['$type', 'ANDERE'] 
        }, 1, 0] 
       } 
      }, 
      customer: { 
       $first: "$header.customernnummer" 
      }, 
      date: { 
       $first: "$date" 
      }, 
      type: { 
       $first: "$type" 
      }, 
      positions: { 
       $first: "$positions" 
      } 
     } 
    }, 
    { 
     $unwind: "$positions" 
    }, 
    { 
     $project: { 
      "_id": 1, 
      customer: "$customer", 
      date: 1, 
      ordertype: "$header.ordertype", 
      type: "$type", 
      value: { 
       $multiply: ["$positions.price", "$positions.quantity"] 
      }, 
      price: "$positions.price", 
      quantity: "$positions.quantity", 
      orderQuantity: { 
       $cond: { 
        if: { 
         $eq: ["$type", "WERBUNG"] 
        }, 
        then: "$werbungCount", 
        else: "$andereCount" 
       } 
      }, 
     } 
    }, 
    { 
     $group: { 
      _id: { 
       type: "$type", 
       tag: "$date", 
       customer: "$customer" 
      }, 
      type: { 
       $first: "$type" 
      }, 
      date: { 
       $first: "$date" 
      }, 
      wert: { 
       $sum: "$value" 
      }, 
      orderQuantity: { 
       $first: "$orderQuantity" 
      } 
     } 
    }, 
    { 
     $group: { 
      _id: { 
       typ: "$type", 
       date: "$date" 
      }, 
      orderQuantity: { 
       $first: "$orderQuantity" 
      }, 
      value: { 
       $sum: "$wert" 
      } 
     } 
    }, 
    { 
     $sort: { 
      typ: 1, 
      date: -1 
     } 
    } 
]) 

我用第$項目到 「正常化」 的日期。因此,訂單在1499415886:2017年7月7日星期五上午8點24分46秒46秒1499415990:2017年7月7日星期五上午8點26分30秒00秒將同時計數,因爲它們是同一天因爲我還可以從你寫的東西告訴大家,時間不要緊,你,只有$項目後日期)

$組你只算具有「訂單類型」的文件WERBUNG並將它們設置爲werbungCount,否則如果它們爲空,則將它們設置爲andereCount$ project$ group之後的流水線就像你做的那樣。我只是糾正了一些錯誤,並在一些地方改變了字段的名稱。還添加了orderQuantity字段,第二個條件爲$ project

希望工程!