sql >> Database >  >> NoSQL >> MongoDB

Oproepfunctie binnen mongodb's aggregaat?

Externe functies werken niet met het aggregatieraamwerk. Alles wordt bij invoer geparseerd naar BSON, dus JavaScript of iets anders is niet toegestaan. Dit wordt allemaal in principe verwerkt van BSON "operator"-definitie tot native C++-code-implementatie, dus het is echt snel.

Waar dit op neerkomt, is het "converteren" van uw verwachte logica naar wat het aggregatieraamwerk kan verwerken. Er zijn in feite "logische" operatoren zoals $or en $and die in deze context werken:

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

Dus geen externe functies, implementeer gewoon de logica met de operators die het aggregatieraamwerk levert. Naast de logische basisimplementaties is er $not om de ligic te "omkeren" en $cond die fungeert als een "ternair" om een ​​ander resultaat te geven dan true/false evaluatie.



  1. java - MongoDB + Solr-uitvoeringen

  2. MongoDB-CR-verificatie mislukt

  3. Voortschrijdende gemiddelden met het aggregatieraamwerk van MongoDB?

  4. MongoDB $mul