2017-08-03 43 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

希望工程!