2016-08-05 3 views
1

Ich versuche, die folgendes zu tun:Projektion von Array-Größe Wurffehler für nicht definierte Array

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'}}}])) 

Doch dies wirft ein OperationFailure da $ eine für das leere Dokument nicht definiert ist.

Wie sage ich Mongo, um mir eine 0 für das leere Dokument zu geben? Kann ich auf ein leeres Array zurückgreifen, wenn das Feld a während der Projektion nicht definiert ist?

Antwort

1

können Sie überprüfen, ob das Array vorhanden (wenn auch nicht $ mit existiert) und ansonsten Ausgang 0, etwa so:

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

Der beste Weg, dies mit dem $ifNull Betreiber zu tun ist.

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