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

odeberte hodnoty 0, pokud za 0 následuje>=1 z polí v MongoDB

Jeden přístup je tento:

db.collection.aggregate([
   {
      $set: {
         data: {
            $let: {
               vars: {
                  val: "$data_start",
                  prev: { $concatArrays: [[null], "$data_start"] } // shift values by one element 
               },
               in: {
                  $map: {
                     input: { $range: [0, { $size: "$$val" }] },
                     as: "idx",
                     in: {
                        $cond: {
                           if: {
                              $and: [
                                 { $eq: [{ $arrayElemAt: ["$$val", "$$idx"] }, 0] }, // is 0
                                 { $eq: [{ $arrayElemAt: ["$$val", "$$idx"] }, { $arrayElemAt: ["$$prev", "$$idx"] }] } // is equal to previous
                              ]
                           },
                           then: null,
                           else: {
                              data_start: { $arrayElemAt: ["$$val", "$$idx"] },
                              time_start: { $arrayElemAt: ["$time_start", "$$idx"] }
                           }
                        }
                     }
                  }
               }
            }
         }
      }
   },
   {
      $set: {
         data: {
            $filter: {
               input: "$data",
               cond: "$$this"// -> removes null's from array
            }
         }
      }
   }
])

Možná budete muset doladit podmínku a/nebo obrátit smyčku, tj. input: { $range: [{ $size: "$$val" }, 0, -1] }

Hřiště Mongo



  1. Nasazení MongoDB ve virtuálním privátním cloudu Amazon (VPC)

  2. Nepřímá úprava přetížené vlastnosti Laravel MongoDB

  3. Agregace Mongodb po dnech na základě unixového časového razítka

  4. Jaký je ekvivalent findOne pomocí .aggregate v Mongodb?