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.