MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

mongodb заявка:$size с $gt винаги връща 0

Не можете да направите това, както всъщност е посочено в документацията за $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 } })

И това е "най-добрият" начин да го направите.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Намиране на записи на mongoDB в партиди (с помощта на mongoid ruby ​​адаптер)

  2. Парс сървър - Файлът не е намерен

  3. Golang/mgo:Как мога да поискам от MongoDB да използва текущото време в поле?

  4. Spring Data Mongo Query за заявка с множество полета и връщане с едно извикване

  5. Интерфейс на Mongo