sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB seskupuje všechny klíče a hodnoty v kolekci podle určitého pole

Jste na správné cestě.

Při převodu celého objektu na pole uložte také pole Kategorie.

Potřebné fáze:

  • $project pro uložení kategorie a převedení objektu na pole
  • $rozviňte pole a zvažte každé pole samostatně
  • $match k odstranění _id , Category a všechna další pole, která nechcete seskupovat z pole
  • $group by Category a k vložit hodnoty každého klíče do pole
  • $group by Category sbírat klíče a pole dohromady
  • $project pro převod pole se shromážděnými hodnotami na objekt
  • $addFields pro vložení kategorie do nového objektu
  • $replaceRoot k propagaci nového objektu
db.collection.aggregate([
  {$project: {
      Category: 1,
      fields: {$objectToArray: "$$ROOT"}
  }},
  {$unwind: "$fields"},
  {$match: {"fields.k": {$not: {$in: ["_id","Category"]}} }},
  {$group: {
      _id: {
        Category: "$Category",
        key: "$fields.k"
      },
      value: {$push: "$fields.v"}
  }},
  {$group: {
      _id: "$_id.Category",
      fields: {
        $push: {
          "k": "$_id.key",
          "v": "$value"
        }
      }
  }},
  {$project: {
      fields: {$arrayToObject: "$fields"}
  }},
  {$addFields: {
      "fields.Category": "$_id"
  }},
  {$replaceRoot: { newRoot: "$fields"}}
])

Hřiště




  1. Jak získám seznam pouze ObjectId pomocí pymongo?

  2. MongoDB:Jedinečný klíč ve vloženém dokumentu

  3. MongoDB/PHP odebírá konkrétní položku pole uvnitř dokumentu

  4. Nejúčinnější způsob, jak změnit hodnotu pole řetězce na jeho podřetězec