sql >> Databasteknik >  >> NoSQL >> MongoDB

Hur man får detta resultat med aggregat i mongoDB

Mongo 3.4-version

$map för att multiplicera artikelns pris och värde och $reduce för att beräkna summan av artikelns pris och värde och $reduce för att beräkna summan av kostnadens pris. $subtrahera värden från tidigare reducera för att få det slutliga beloppet.

aggregate([{
    $project: {
        _id: 1,
        amount: {
            $subtract: [{
                $reduce: {
                    input: {
                        $map: {
                            input: "$items",
                            as: "item",
                            in: {
                                $multiply: ["$$item.value", "$$item.price"]
                            }
                        }
                    },
                    initialValue: 0,
                    in: {
                        $add: ["$$value", "$$this"]
                    }
                }
            }, {
                $reduce: {
                    input: "$costs.price",
                    initialValue: 0,
                    in: {
                        $add: ["$$value", "$$this"]
                    }
                }
            }]
        }

    }
}])

Mongo 3.x-version

Första $projektet för att multiplicera objektets värde och pris. Nästa gruppering för att beräkna summan för både artiklar och kostnadsfält, vilket kommer att resultera i ett arrayvärde för varje artikel och kostnadsfält och slutprojektet tittar endast på arrayvärdet från båda arrayerna med $arrayElemAt för att subtrahera värdena från varandra.

aggregate(
    [{
        $project: {
            vpItems: {
                $map: {
                    input: "$items",
                    as: "item",
                    in: {
                        $multiply: ["$$item.value", "$$item.price"]
                    }
                }
            },
            costs: '$costs'
        }
    }, {
        $group: {
            _id: '$_id',
            vpItems: {
                $addToSet: {
                    $sum: '$vpItems'
                }
            },
            pCosts: {
                $addToSet: {
                    $sum: '$costs.price'
                }
            }
        }
    }, {
        $project: {
            _id: 1,
            amount: {
                $subtract: [{
                    $arrayElemAt: ["$vpItems", 0]
                }, {
                    $arrayElemAt: ["$pCosts", 0]
                }]
            }
        }
    }])

Mongo 2.6 version

$unwind artiklar och grupp för att beräkna summan av värden som returneras från multiplicera objektets pris och värde och $unwind kostnader för att beräkna summan av objektets pris &värde och projektera för att $subtrahera värden från tidigare gruppering för att beräkna slutbeloppet.

aggregate([{
      $unwind: '$items'
  }, {
      $group: {
          _id: '$_id',
          totalItems: {
              $sum: {
                  $multiply: ["$items.value", "$items.price"]
              }
          },
          costs: {
              $first: '$costs'
          }
      }
  }, {
      $unwind: '$costs'
  }, {
      $group: {
          _id: '$_id',
          totalItems: {
              $first: '$totalItems'
          },
          totalPrice: {
              $sum: '$costs.price'
          }
      }
  }, {
      $project: {
          _id: 1,
          amount: {
              $subtract: ['$totalItems', '$totalPrice']
          }
      }
  }])



  1. Flask användarautentisering

  2. Node.js, Socket.io, Redis pub/sub hög volym, svårigheter med låg latens

  3. Validerar det unika hos ett inbäddat dokument som omfattas av dess förälder i mongoose

  4. Förstöra / ta bort en Queue() i Redis Queue (rq) programmatiskt