mongodb - wie man findet und dann aggregiert


74

Ich habe eine Sammlung, die Dokumente mit dem folgenden Schema enthält. Ich möchte alle Dokumente filtern / finden, die das weibliche Geschlecht enthalten, und die Summe der Gehirnwerte zusammenfassen. Ich habe die folgende Anweisung ausprobiert und sie zeigt einen ungültigen Pipelinefehler.

db['!all'].aggregate({ $and: [ {'GENDER' :  'F'} , {'DOB' : { $gte : 19400801, $lte : 20131231 }} ]  }, { $group : { _id : "$GENDER", totalscore : { $sum : "$BRAINSCORE" } } } )

Schema:

{
"_id" : ObjectId("53f63fc8f2b643f6ebb8a1a9"),
"DOB" : 19690112,
"GENDER" : "F",
"BRAINSCORE" : 65
},
{
"_id" : ObjectId("53f63fc8f2b643f6ebb8a1a2"),
"DOB" : 19950116,
"GENDER" : "F",
"BRAINSCORE" : 44
},
{
"_id" : ObjectId("53f63fc8f2b643f6ebb8a902"),
"DOB" : 19430216,
"GENDER" : "M",
"BRAINSCORE" : 71
}

Bitte helfen Sie ...

Antworten:


131

Sie müssen $ match verwenden :

db['!all'].aggregate([
  {$match:
    {'GENDER': 'F',
     'DOB':
      { $gte: 19400801,
        $lte: 20131231 } } },
  {$group:
     {_id: "$GENDER",
     totalscore:{ $sum: "$BRAINSCORE"}}}
])

Ausgänge:

{ "_id" : "F", "totalscore" : 109 }

3
Wofür steht ['! all']?
Cafebabe1991

1
Ich habe gerade diesen Code aus der Frage kopiert. '! all' scheint der Name der Sammlung zu sein, hängt aber nicht mit der Antwort selbst zusammen
Enrique Fueyo

Bedeutet [! All] alle Sammlungen?
Cafebabe1991

2
Nein, ich glaube nicht
Enrique Fueyo

10
[! all] sollte NICHT ALL bedeuten und es ist eine seltsame Art, eine Sammlung zu benennen;)
c24b

6

Beispiel für eine Arbeitsabfrage:

db.getCollection('NOTIF_EVENT_RESULT').aggregate([
{$match:
    {'userId': {'$in' : ['user-900', 'user-1546']},
    'criteria.operator': 'greater than', 'criteria.thresold' : '90', 'category' : 'capacity'}
},
{"$group" :  {_id : {userId:"$userId"}, "count" : { "$sum" : 1} } }
])

1

Hier ist eine Antwort, wenn die DOB-Nummern in Datum konvertiert und dann verglichen werden müssen. Wenn nicht, wird eine Zahl oder ein Datum wie 1970 fälschlicherweise $ gte bis 19400801 sein (Sie können es versuchen):

db['!all'].aggregate([
    {
        $addFields: {
            "_temp_DOB": {
                $dateFromString: {
                    dateString: {$toString: {$toLong: "$DOB"}},
                    format: "%Y%m%d"
                }
            }
        }   
    },
    {
        $match: {
            'GENDER': 'F', 
            '_temp_DOB': { $gte: new Date("1940-08-01"),  
                           $lte: new Date("2013-12-31") }
        }
    },
    {
        $group: {
            _id: "$GENDER", 
            totalscore: { $sum: "$BRAINSCORE" }
        }
    }
])

Ausgänge:

{ "_id" : "F", "totalscore" : 109 }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.