2016-10-31 1 views
0

Die Frage ist Berechnen Sie das Durchschnittsalter der Benutzer, die mehr als 3 Stärken aufgeführt haben.mongo db wie schreibe ich eine Funktion in einer Abfrage vielleicht Aggregation?

Einer der Daten ist wie folgt:

{ 
    "_id" : 1.0, 
    "user_id" : "jshaw0", 
    "first_name" : "Judy", 
    "last_name" : "Shaw", 
    "email" : "[email protected]", 
    "age" : 39.0, 
    "status" : "disabled", 
    "join_date" : "2016-09-05", 
    "last_login_date" : "2016-09-30 23:59:36 -0400", 
    "address" : { 
     "city" : "Deskle", 
     "province" : "PEI" 
    }, 
    "strengths" : [ 
     "star schema", 
     "dw planning", 
     "sql", 
     "mongo queries" 
    ], 
    "courses" : [ 
     { 
      "code" : "CSIS2300", 
      "total_questions" : 118.0, 
      "correct_answers" : 107.0, 
      "incorect_answers" : 11.0 
     }, 
     { 
      "code" : "CSIS3300", 
      "total_questions" : 101.0, 
      "correct_answers" : 34.0, 
      "incorect_answers" : 67.0 
     } 
    ] 
} 

Ich weiß, dass ich zählen müssen, wie viele Stärken diese Daten hat, und stellen Sie ihn dann auf $gt, und dann das Durchschnittsalter zu berechnen. Allerdings kann ich nicht 2 Funktionen schreiben, die in einer Abfrage zählen und durchschnittlich sind. Muss ich Aggregation verwenden, wenn ja, wie?

Vielen Dank

Antwort

0

Verwenden $redact Ihre Array-Größe & $group berechnen den Durchschnitt entsprechen:

db.collection.aggregate([{ 
    "$redact": { 
     "$cond": [ 
      { "$gt": [{ "$size": "$strengths" }, 3] }, 
      "$$KEEP", 
      "$$PRUNE" 
     ] 
    } 
}, { 
    $group: { 
     _id: 1, 
     average: { $avg: "$age" } 
    } 
}]) 

Der $redact Teil die Größe der strenghs Array größer als 3 entsprechen, wird es $$KEEP Datensatz, passen Sie diese Bedingung sonst $$PRUNE der Datensatz, die nicht übereinstimmen. Prüfen $redact documentation

Die $group nur eine durchschnittliche führen mit $avg

0

Sie Projekt mit Spiel auf Array-Größe und Gruppe am Ende können das Durchschnittsalter zu berechnen.

db.averageAge.aggregate([{ 
    $project: { 
     age: 1, 
     count: { 
      $size: "$strengths" 
     } 
    } 
}, { 
    $match: { 
     count: { 
      $gt: 3 
     } 
    } 
}, { 
    $group: { 
     _id: 1, 
     averageAge: { 
      $avg: "$age" 
     } 
    } 
}])