Не можете да направите това, както всъщност е посочено в документацията за $size
. Така че този оператор сам оценява "буквален" резултат и не може да се използва заедно с "оператори за обхват", каквито питате.
Единствените ви реални възможности са да поискате „размер“, който „не е равен на 0“, като отхвърлите условието с $not
оператор. Което е напълно валидно:
db.userStats.count({ "sessions": { "$not": { "$size": 0 } } });
Или по друг начин тествайте с другото въплъщение на $size
в рамката за агрегиране, стига вашата версия на MongoDB да е 2.6 или по-нова:
db.userStats.aggregate([
{ "$group": {
"_id": null,
"count": {
"$sum": {
"$cond": [
{ "$gt": [ { "$size": "$sessions", 0 } ] },
1,
0
]
}
}
}}
])
Вероятно и с $where
форма на оценка на JavaScript:
db.userStats.count(function() { return this.sessions.length > 0 });
Но вероятно по-бавно от последната версия.
Или всъщност можете просто да направите това с "нотация с точки" и $exists
оператор:
db.userStats.count({ "sesssions.0": { "$exists": true } });
Тъй като общата идея е, че ако има елемент с индекс 0
тогава масивът има някаква дължина.
Всичко зависи от вашия подход, но всяка от тези форми дава правилния резултат.
Но за „най-добрата“ производителност от MongoDB, не използвайте никое от тези методи. Вместо това, запазете масива "length" като свойство на документа, който проверявате. Това можете да „индексирате“ и изпратените заявки действително имат достъп до този индекс, което никой от горните не може да направи.
Поддържайте го така:
db.userStats.update(
{ "_id": docId, "sessions": { "$ne": newItem } },
{
"$push": { "sessions": newItem },
"$inc": { "countSessions": 1 }
}
)
Или за премахване:
db.userStats.update(
{ "_id": docId, "sessions": newItem },
{
"$pull": { "sessions": newItem },
"$inc": { "countSessions": -1 }
}
)
След това можете просто да направите заявка за „countSesssions“, която също може да индексира за най-добра производителност:
db.userStats.find({ "countSessions": { "$gt": 0 } })
И това е "най-добрият" начин да го направите.