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

Mongo Query Indlejrede feltværdier med ukendte overordnede nøgler på to niveauer

Kortreducering giver dig mulighed for at behandle navngivne nøgler, men aggregering er vejen at gå for effektive forespørgsler.

Du skal modellere dataene som en række indlejrede dokumenter til aggregeringsramme.

Jeg har givet dig to muligheder. Du kan teste dem til dit datasæt og se, hvilket der fungerer bedst for dig.

Noget lignende

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

Nu kan du nemt forespørge efter elementer, der har sensoraflæsning:"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"}}]
)

Alternativt kan du opdele dokumenterne efter minut. Noget lignende

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

Du kan nu forespørge som (med indeks på v.data.field1)

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

Du kan forespørge på elementer, der har sensorlæsning:"field1">2 og "field3">5

Brug af første struktur

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"}}]
)

Brug af anden struktur

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"}}]
)

Mongo Update 3.6

$match med $expr som accepterer aggregeringsudtryk.

$gt > 0 - aggregeringsudtryk for at kontrollere, hvor summen af ​​alle matchende sekunders kriterier i et minut er større end 0

$objectToArray at konvertere de navngivne nøgler til nøgleværdipar efterfulgt af $filter sekunder på inputkriterier og outputnummer af matchende sekundpost.

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 - Erstat $expr med $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. Mongo Query mislykkedes med fejlkode 13 og fejlmeddelelsen 'ikke autoriseret'

  2. Sådan søger du kommaseparerede data i mongodb

  3. mongoose forbindelse connectTimeoutMS

  4. ServiceStack Entities Id feltnavn