sql >> Database >  >> NoSQL >> MongoDB

mongodb-query:$size met $gt retourneert altijd 0

U kunt dat niet doen, zoals daadwerkelijk wordt vermeld in de documentatie voor $size . Zodat alleen die operator een "letterlijk" resultaat evalueert en kan niet worden gebruikt in combinatie met "bereikoperators", zoals u vraagt.

Je enige echte opties zijn om een ​​"maat" te vragen die "niet gelijk is aan 0" door de voorwaarde te negeren met de $not exploitant. Wat volkomen terecht is:

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

Of test anders met de andere incarnatie van $size in het aggregatieraamwerk, zolang uw MongoDB-versie 2.6 of hoger is:

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

Eventueel ook met de $where vorm van JavaScript-evaluatie:

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

Maar waarschijnlijk langzamer dan de laatste versie.

Of in feite kun je dit gewoon doen met "dot notation" , en de $exists operator:

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

Omdat het algemene idee is dat als er een element is in de index 0 dan heeft de array enige lengte.

Het hangt allemaal af van je aanpak, maar elk van deze vormen levert het juiste resultaat op.

Maar voor de "beste" prestaties van MongoDB, gebruik geen geen van deze methoden. Bewaar in plaats daarvan de array "length" als een eigenschap van het document dat u inspecteert. Dit kunt u "indexeren" en de uitgegeven query's hebben daadwerkelijk toegang tot die index, wat geen van de bovenstaande kan doen.

Onderhoud het als volgt:

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

Of om te verwijderen:

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

Vervolgens kunt u een zoekopdracht uitvoeren op "countSesssions", die ook kan indexeren voor de beste prestaties:

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

En dat is de "beste" manier om het te doen.



  1. XML naar BSON met C#

  2. Haal het meest recente subdocument op uit Array

  3. Spring data mongodb sluit mongodb-verbindingen niet

  4. Hoe wordt Redis gebruikt in Trello?