2016-03-30 4 views
2

Ich habe zwei Sammlungen: Tests und Reports. Sie sind verwandt und Reports haben Feldtest mit Test.id. Jedes Test Dokument hat testers_count Feld.Zähle und vergleiche verwandte Dokumente in einer Abfrage

Auch ich habe Abfrage geschrieben sollte nur Tests mit testers_count größer oder gleich count von verwandten docs zurückgegeben werden.

db.test.aggregate([ 
    { 
     $lookup: 
     { 
      from: 'reports', 
      localField: '_id', 
      foreignField: 'test', 
      as: 'reportsList' 
     } 
    }, 
    { 
     $match: { 
     "settings.testers_count": {$gte: {$size: "$reportsList"}} 
     } 
    } 
]) 

Das Problem ist, dass der Code nicht funktioniert und keinen Fehler zurückgibt.

+0

Ist die Sammlung namens 'Reports' oder' reports'? – Philipp

+1

@Blakes Sie haben Recht, die $ Übereinstimmung ist "falsch". Soweit ich weiß, sollte der Wert eine Zahl oder eine Zeichenfolge sein. Aber es ist schwierig zu verstehen ohne Fehler ( – pavolve

+1

Deshalb gibt es eine "Antwort" auf die Frage. $ Match ist nicht die richtige Verwendung in diesem Zusammenhang. –

Antwort

1

Ziemlich sicher, dass Sie tatsächlich bedeuten:

db.test.aggregate([ 
    { "$lookup": { 
    "from": "reports", 
    "localField": "_id", 
    "foreignField": "test", 
    "as": "reportsList" 
    }}, 
    { "$redact": { 
    "$cond": { 
     "if": { 
     "$gte": [ 
      "$settings.testers_count", 
      { "$size": "$reportsLIst" } 
     ] 
     }, 
     "then": "$$KEEP", 
     "else": "$$PRUNE" 
    } 
    }} 
]) 

der Annahme, daß $settings.testers_count löst tatsächlich ein „singuläres“ Eigentum, und ist nicht Mitglied in einem „Array“.

Die verwendet $redact stattdessen und die "logische" Form von $gte für die Auswertung.

Auch der Operator $size kann nur in einem solchen Auswertungsausdruck verwendet werden, wie $redact ermöglicht. Der Operator $match ist in der Konzept- und Operatorsyntax zu .find() wirklich identisch, da er eine "Abfrage" ausführt und tatsächlich nur die berechneten Operatoren "query operators" und no verwenden kann.

Dies ist, was $redact eigentlich ist. Es ist ein "logischer Ausdruck" -Form von $match

Verwandte Themen