sql >> Database teknologi >  >> NoSQL >> MongoDB

hvordan kan jeg finde en række værdier i en $match-sammenlægning og gruppere resultatet?

Du skal ændre dine filters som vist nedenfor.

Forklaring

  1. Vi inkluderer filtre i dokumentstrukturen med $addFields operatør. Dette vil hjælpe os med at beregne alle de nødvendige værdier.
  2. Vi filtrerer toys med de nyligt inkluderede filters attribut med $expr operatør.
  3. Anvendelse af $filter operatør, får vi alt legetøj med den samme code fra filters . Nu kan vi beregne total og price_total værdier.
  4. Vi kunne beregne total_coincidences inde i $group trin som dette:

Men du har nævnt "særskilt element". Så vi opretter sæt unikke legetøjskoder og tæller varer i sættet.

db.collection.aggregate([
  {
    $unwind: "$toys"
  },
  {
    $addFields: {
      "filters": [
        {
          "code": 17001,
          "quantify": 2
        },
        {
          "code": 17003,
          "quantify": 4
        },
        {
          "code": 17005,
          "quantify": 5
        },
        {
          "code": 17005,
          "quantify": 6
        }
      ]
    }
  },
  {
    $match: {
      $expr: {
        $in: [ "$toys.code", "$filters.code"]
      }
    }
  },
  {
    $group: {
      _id: "$toystore_name",
      total_coincidences: {
        $addToSet: "$toys.code"
      },
      toy_array: {
        $push: {
          "price_original": "$toys.price",
          "toy": "$toys.toy",
          "total": {
            $size: {
              $filter: {
                input: "$filters",
                cond: {
                  $eq: [ "$$this.code", "$toys.code"]
                }
              }
            }
          },
          price_total: {
            $sum: {
              $map: {
                input: {
                  $filter: {
                    input: "$filters",
                    cond: {
                      $eq: [ "$$this.code", "$toys.code" ]
                    }
                  }
                },
                in: {
                  $multiply: [ "$toys.price", "$$this.quantify" ]
                }
              }
            }
          }
        }
      }
    }
  },
  {
    $addFields: {
      total_coincidences: {
        $size: "$total_coincidences"
      }
    }
  },
  {
    $sort: { _id: 1 }
  }
])

MongoPlayground




  1. krydstabel-forespørgsel eller virtuals for at gemme data ved hjælp af mongoose

  2. MongoDB aggregering $divide beregnede felter

  3. MongoDB Objektnøgle med ES6 skabelonstreng

  4. Støb almindeligt objekt til mongoose-dokument