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

Mongo Query vnořené hodnoty polí s dvouúrovňovými neznámými nadřazenými klíči

Map reduction vám umožňuje zpracovávat pojmenované klíče, ale agregace je způsob, jak dosáhnout efektivních dotazů.

Musíte modelovat data jako pole vložených dokumentů pro agregační rámec.

Nabídl jsem vám dvě možnosti. Můžete je otestovat pro svou datovou sadu a zjistit, která vám vyhovuje lépe.

Něco jako

"v":[
  {
    "minute":1,
    "seconds":[
      {
        "second":54,
        "data":{
         "field1":7.373158,
         "entry_id":4635,
         "field3":0.19,
         "field2":88
       }
      }
    ]
  },
  {
    "minute":2,
    "seconds":...
  }
]

Nyní můžete snadno vyhledávat položky, které mají hodnotu senzoru:"field1">2.

db.col.aggregate(
  [{"$match":{"v.seconds.data.field1":{"$gt":2}}},
   {"$unwind":"$v"}, 
   {"$match":{"v.seconds.data.field1":{"$gt":2}}},
   {"$unwind":"$v.seconds"}, 
   {"$match":{"v.seconds.data.field1":{"$gt":2}}},
   {"$project":{"data":"$v.seconds.data"}}]
)

Případně můžete dokumenty rozdělit na minuty. Něco jako

"v":[
  {
    "second":1,
    "data":{
       "field1":7.373158,
       "entry_id":4635,
       "field3":0.19,
       "field2":88
     }
  },
  {
     "second":2,
     "data":...
  }
]

Nyní můžete dotazovat jako (s indexem na v.data.field1)

db.col.aggregate(
  [{"$match":{"v.data.field1":{"$gt":2}}},
   {"$unwind":"$v"}, 
   {"$match":{"v.data.field1":{"$gt":2}}},
   {"$project":{"data":"$v.data"}}]
)

Můžete se dotazovat na položky, které mají čtení senzoru:"field1">2 a "field3">5

Použití první struktury

db.col.aggregate(
  [{"$match":{"v":{"$elemMatch":{"seconds": {$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}}}},
  {"$unwind":"$v"}, 
    {"$match":{"v.seconds": {$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}},
  {"$unwind":"$v.seconds"}, 
  {"$project":{"data":"$v.seconds.data"}}]
)

Použití druhé struktury

db.col.aggregate(
  [{"$match":{"v.data":{$elemMatch:{"field1":{$gt":2},"field3":{$gt":5}}}}},
  {"$unwind":"$v"}, 
  {"$match":{"v.data.field1":{"$gt":2},"v.data.field3":{"$gt":5} }},
  {"$project":{"data":"$v.data"}}]
)

Aktualizace Mongo 3.6

$match s $expr který přijímá agregační výraz.

$gt > 0 - agregační výraz pro kontrolu, kde je součet všech odpovídajících kritérií sekund za minutu větší než 0

$objectToArray převést pojmenované klíče na pár klíč-hodnota následovaný $filter sekund na vstupní kritéria a výstupní číslo odpovídajících sekund záznamu.

db.testcol.aggregate(
{"$match":{
  "$expr":{
    "$gt":[
      {"$sum":{
        "$map":{
          "input":{"$objectToArray":"$v"},
          "as":"secondsofminute",
          "in":{
            "$size":{
              "$filter":{
                "input":{"$objectToArray":"$$secondsofminute.v"},
                "as":"seconds",
                "cond":{"$gt":["$$seconds.v.field2",2]}
              }
            }
          }
        }
      }},
    0]
  }
}})

Mongo Update 3.4 – Nahraďte $expr s $redact

db.col.aggregate(
 {"$redact":{
  "$cond":{
    "if":{
      "$gt":[
        {"$sum":{
          "$map":{
            "input":{"$objectToArray":"$v"},
            "as":"secondsofminute",
            "in":{
              "$size":{
                "$filter":{
                  "input":{"$objectToArray":"$$secondsofminute.v"},
                  "as":"seconds",
                  "cond":{"$gt":["$$seconds.v.field2",2]}
                }
              }
            }
          }
        }},
        0]
    },
   "then":"$$KEEP",
   "else":"$$PRUNE"
  }
}})



  1. Proveďte průnik agregace/nastavení na MongoDB

  2. Úvod do HDFS Federation &Architecture

  3. Úvod do datových struktur Redis:Seřazené sady

  4. Jak obnovím MongoDB ChangeStream při prvním dokumentu a nejen změny poté, co začnu poslouchat