sql >> Databasteknik >  >> NoSQL >> MongoDB

mongodb-fråga:$size med $gt returnerar alltid 0

Du kan inte göra det som det faktiskt hänvisas till i dokumentationen för $size . Så den operatören ensam utvärderar ett "bokstavligt" resultat och kan inte användas tillsammans med "intervalloperatorer" som du frågar om.

Dina enda riktiga alternativ är att be om en "storlek" som "inte är lika med 0" genom att negera villkoret med $not operatör. Vilket är helt giltigt:

db.userStats.count({ "sessions": { "$not": { "$size": 0 } } });

Eller på annat sätt testa med den andra inkarnationen av $size i aggregeringsramverket, så länge din MongoDB-version är 2.6 eller senare:

db.userStats.aggregate([
    { "$group": {
         "_id": null,
         "count": {
             "$sum": {
                 "$cond": [
                     { "$gt": [ { "$size": "$sessions", 0 } ] },
                     1,
                     0
                 ]
             }
         }
    }}
])

Möjligen också med $where form av JavaScript-utvärdering:

db.userStats.count(function() { return this.sessions.length > 0 });

Men troligen långsammare än den senaste versionen.

Eller faktiskt kan du bara göra detta med "dot notation" , och $exists operatör:

db.userStats.count({ "sesssions.0": { "$exists": true } });

Som den allmänna idén är att om det finns ett element i indexet 0 då har arrayen en viss längd.

Allt beror på ditt tillvägagångssätt, men vilken som helst av dessa former får rätt resultat.

Men för den "bästa" prestandan från MongoDB, använd inte någon av dessa metoder. Behåll istället arrayen "längd" som en egenskap för dokumentet du inspekterar. Detta kan du "indexera" och de frågor som utfärdas kan faktiskt komma åt det indexet, vilket inget av ovanstående kan göra.

Behåll det så här:

db.userStats.update(
     { "_id": docId, "sessions": { "$ne": newItem } },
     {
         "$push": { "sessions": newItem },
         "$inc": { "countSessions": 1 }
     }
)

Eller för att ta bort:

db.userStats.update(
     { "_id": docId, "sessions": newItem  },
     {
         "$pull": { "sessions": newItem },
         "$inc": { "countSessions": -1 }
     }
)

Sedan kan du bara fråga på "countSesssions" som också kan indexera för bästa prestanda:

db.userStats.find({ "countSessions": { "$gt": 0 } })

Och det är det "bästa" sättet att göra det.



  1. Vad är användningen av filen mongo.lock?

  2. exportera och importera data från mongodb med node.js express

  3. Fjäderdata MongoDb:MappingMongoConverter remove _class

  4. 5 sätt att få månaden från ett datum i MongoDB