sql >> Databáze >  >> NoSQL >> MongoDB

dotaz mongodb:$velikost s $gt vrací vždy 0

Nemůžete to udělat, jak je skutečně uvedeno v dokumentaci pro $size . Takže operátor sám vyhodnotí "doslovný" výsledek a nemůže použít ve spojení s "operátory rozsahu", jak se ptáte.

Vaše jediná skutečná možnost je požádat o „velikost“, která se „nerovná 0“ negováním podmínky pomocí $not operátor. Což naprosto platí:

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

Nebo jinak otestujte s jinou inkarnací $size v agregačním rámci, pokud je vaše verze MongoDB 2.6 nebo vyšší:

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

Případně také pomocí $where forma hodnocení JavaScriptu:

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

Ale pravděpodobně pomalejší než poslední verze.

Nebo to můžete ve skutečnosti udělat pomocí "dot notation" a $exists operátor:

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

Obecná myšlenka je, že pokud je na indexu prvek 0 pak má pole nějakou délku.

Vše závisí na vašem přístupu, ale každá z těchto forem má správný výsledek.

Ale pro „nejlepší“ výkon z MongoDB nepoužívejte žádné těchto metod. Místo toho ponechte pole "délka" jako vlastnost dokumentu, který kontrolujete. Toto můžete "indexovat" a zadané dotazy mohou skutečně přistupovat k tomuto indexu, což žádný z výše uvedených nemůže udělat.

Udržujte to takto:

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

Nebo pro odstranění:

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

Pak se můžete jen zeptat na "countSesssions", které také mohou indexovat pro nejlepší výkon:

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

A to je "nejlepší" způsob, jak to udělat.



  1. Přejmenujte ObjectId _id na id v jackson deserializaci s Jongo a MongoDB

  2. MongoDB Group a odečtení hodnot z různých dokumentů

  3. Mongoose - najít poslední zprávu od každého uživatele

  4. pozadí mongo createIndex blokuje shell