2016-08-05 2 views
1

Я пытаюсь сделать следующее:Проекция от размера массива метания ошибки для неопределенного массива

for i in range(5): 
    collection.insert({'a': ['1' for j in range(i)]} if i else {}) 

# the collection now contains 5 documents: one with only an _id field 
# and four with an _id and an array of different sizes.] 

list(m.aggregate([{'$project': {'a': 1, 'amt': {'$size': '$a'}}}])) 

Однако, это бросает OperationFailure поскольку $ а не определенно для пустого документа.

Как я могу сообщить Монго, чтобы дать мне 0 для пустого документа? Можно ли вернуться в пустой массив, если поле a не определено во время проецирования?

ответ

1

Вы можете проверить, если массив существует (хотя и не с помощью $ существует) и в противном случае выход 0, как так:

{ 
    '$project': { 
     'a': 1, 
     'amt': { 
      $cond: [ {$gt: ["$a", null]}, {'$size': '$a'}, 0 ] 
     } 
    } 
} 
1

Лучший способ сделать это с оператором $ifNull.

db.collection.aggregate([ 
    { "$project": { 
     "a": 1, 
     "amt": { "$size": { "$ifNull": [ "$a", [] ] } } 
    }} 
]) 
Смежные вопросы