MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Mongo Query Zagnieżdżone wartości pól z dwupoziomowymi nieznanymi kluczami nadrzędnymi

Map Reduce umożliwia przetwarzanie nazwanych kluczy, ale agregacja jest sposobem na wydajne zapytania.

Musisz modelować dane jako tablicę osadzonych dokumentów dla struktury agregacji.

Dałam ci dwie opcje. Możesz je przetestować pod kątem swojego zbioru danych i zobaczyć, który z nich działa lepiej dla Ciebie.

Coś jak

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

Teraz możesz łatwo wyszukiwać artykuły, które mają odczyt czujnika:"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"}}]
)

Alternatywnie możesz podzielić dokumenty na minuty. Coś jak

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

Możesz teraz wykonać zapytanie takie jak ( z indeksem 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"}}]
)

Możesz zapytać o pozycje, które mają odczyt czujnika:"field1">2 i "field3">5

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

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

Aktualizacja Mongo 3.6

$match z $expr który akceptuje wyrażenie agregacji.

$gt > 0 - wyrażenie agregujące, aby sprawdzić, gdzie suma wszystkich pasujących kryteriów sekund w ciągu minuty jest większa niż 0

$objectToArray aby przekonwertować nazwane klucze na parę klucz-wartość, po której następuje $filter sekundy na kryteriach wejściowych i liczbie wyjściowej pasującego rekordu sekund.

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 - Zastąp $expr z $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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. 2 sposoby na zastąpienie podciągu w MongoDB

  2. django admin filters i mongodb:Caught DatabaseError podczas renderowania:To zapytanie nie jest obsługiwane przez bazę danych

  3. Mongoose:Jak zapełnić populację o głębokości 2 poziomu bez wypełniania pól pierwszego poziomu? w mongodb

  4. Repozytorium Spring automatycznie rzuca encje z różnymi typami klas

  5. MongoDb sortuj kolekcję według liczby w innej kolekcji