sql >> Databasteknik >  >> NoSQL >> MongoDB

Ringa funktion inuti mongodbs aggregat?

Externa funktioner fungerar inte med aggregeringsramverket. Allt tolkas till BSON vid inmatning, så inget JavaScript eller något annat är tillåtet. Allt detta bearbetas i princip från BSON-"operator"-definition till inbyggd C++-kodimplementering så det går riktigt snabbt.

Vad det handlar om är att "konvertera" din förväntade logik till vad aggregeringsramverket kan bearbeta. Det finns faktiskt "logiska" operatorer som $or och $and som fungerar i detta sammanhang:

db.collection.aggregate([
    { "$project": {
       "_id": 1,
       "status": {
           "$cond": [
               { "$or": [
                   // Your first set of rules requires "false" for "flag1" or 
                   // "flag2" and "true" for "flag3"
                   { "$and": [
                       { "$not": [
                           { "$or": [ "$flag1", "$flag2" ] },
                       ]},
                       "$flag3"
                   ]},
                   // Your second set of rules requires "true" for "flag1" or 
                   // "flag2" and "false" for "flag3"
                   { "$and": [
                       { "$or": [ "$flag1", "$flag2" ] },
                       { "$not": [ "$flag3" ] }
                   ]},
               ]},
               "ok",
               "broken"
           ]
       }
    }}
])

Så inga externa funktioner, implementera bara logiken med operatörerna som aggregeringsramverket tillhandahåller. Utöver de grundläggande logiska implementeringarna finns $not för att "vända om" ligicen och $cond som fungerar som en "ternär" för att ge ett annat resultat än true/false utvärdering.



  1. ServiceStack.Net Redis:Lagring av relaterade objekt vs. relaterade objekt-ID

  2. Spring Data MongoDB med Java 8 LocalDate MappingException

  3. använder kartan för att cache för cirka 5000 poster i Javascript-applikation VS Redis

  4. MongoDB skapade filer