未定义数组的数组大小抛出错误的投影

时间:2016-08-05 22:43:51

标签: mongodb aggregation-framework pymongo

我正在尝试执行以下操作:

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,因为没有为空文档定义$ a。

如何告诉Mongo为空文档给我一个0?如果在投影期间未定义字段a,我可以回退到空数组吗?

2 个答案:

答案 0 :(得分:3)

执行此操作的最佳方法是使用$ifNull运算符。

db.collection.aggregate([
    { "$project": {
        "a": 1, 
        "amt": { "$size": { "$ifNull": [ "$a", [] ] } }
    }}
])

答案 1 :(得分:2)

您可以检查数组是否存在(虽然不使用$ exists),否则输出0,如下所示:

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