2016-08-05 89 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因爲$ a不爲空的文檔定義。

我該如何告訴Mongo給我一個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", [] ] } } 
    }} 
])