2016-10-30 1 views
0

Ich habe eine Sammlung ähnlich dieser:Verwendung Mongo Aggregat und Projekt

{ 
"_id" : ObjectId("57dc2b63add5c5e91f185fe0"), 
"level" : 2, 
"profili" : [ 
    { 
     "_id" : ObjectId("507f1f77bcf86cd799439011"), 
     "idprofilo" : ObjectId("57fe3c51569b5c0afb88498b"), 
     "costopag" : 1, 
     "pagmax" : 10, 
     "pagmin" : 1 
    }, 
    { 
     "_id" : ObjectId("507f191e810c19729de860ea"), 
     "idprofilo" : ObjectId("57fe3c51569b5c0afb88498b"), 
     "costopag" : 0.5, 
     "pagmax" : 100, 
     "pagmin" : 11 
    } 
], 
"__v" : 0 
}, 
{ 
"_id" : ObjectId("57dc39945aec26b303053dd7"), 
"level" : 2, 
"profili" : [ 
    { 
     "_id" : ObjectId("507f1f77bcf86cd799439012"), 
     "idprofilo" : ObjectId("57fe3c51569b5c0afb88498b"), 
     "costopag" : 10, 
     "pagmax" : 100, 
     "pagmin" : 11 
    } 
] 
}, 
{ 
"_id" : ObjectId("57e7ff05a0ef6d07c3048d7f"), 
"level" : 2, 
"profili" : [ 
    { 
     "_id" : ObjectId("507f1f77bcf86cd799439013"), 
     "idprofilo" : ObjectId("57fe3c51569b5c0afb88498c"), 
     "costopag" : 0.5, 
     "pagmax" : 10, 
     "pagmin" : 1 
    } 
] 
}, 
{ 
"_id" : ObjectId("57e7ff54a0ef6d07c3048d81"), 
"level" : 2, 
"profili" : [ 
    { 
     "_id" : ObjectId("507f1f77bcf86cd799439014"), 
     "idprofilo" : ObjectId("57fe3c51569b5c0afb88498c"), 
     "costopag" : 5, 
     "pagmax" : 10, 
     "pagmin" : 1 
    } 
], 
"__v" : 0 
} 

Ich brauche eine docs zu suchen, die einen bestimmten „profili“ haben. Wenn ich führe Sie diesen Fund:

database.Utente.find({ 
     "level":2, 
     profili: { 
     $elemMatch:{ 
      idprofilo: '57fe3c51569b5c0afb88498b', 
      pagmin: {$lte:2}, 
      pagmax: {$gte:2} 
     } 
     } 
    }) 

Die Ergebnisse sind:

{ 
"_id" : ObjectId("57dc2b63add5c5e91f185fe0"), 
"level" : 2, 
"profili" : [ 
    { 
     "_id" : ObjectId("507f1f77bcf86cd799439011"), 
     "idprofilo" : ObjectId("57fe3c51569b5c0afb88498b"), 
     "costopag" : 1, 
     "pagmax" : 10, 
     "pagmin" : 1 
    }, 
    { 
     "_id" : ObjectId("507f191e810c19729de860ea"), 
     "idprofilo" : ObjectId("57fe3c51569b5c0afb88498b"), 
     "costopag" : 0.5, 
     "pagmax" : 100, 
     "pagmin" : 11 
    } 
], 
"__v" : 0 
} 

Wenn möglich, würde ich nicht die profili.id = 507f191e810c19729de860ea weil nicht auf Anfrage responde. Ich habe gelesen, dass es möglich ist mit .aggregate und $ Projekt-Operator, aber ich verstehe nicht, wie ich kann.

Antwort

0

Sie müssen aggregate mit $filter am $project Bühne verwenden:

db.test.aggregate([ 
    { 
     $match: { 
      level: 2 
     } 
    }, 
    { 
     $project: { 
      level: 1, 
      profili: { 
       $filter: { 
        input: '$profili', 
        as: 'prof', 
        cond: { 
         $and : [ 
          {$eq: ['$$prof.idprofilo', ObjectId('57fe3c51569b5c0afb88498b')]}, 
          {$lte: ['$$prof.pagmin', 2]}, 
          {$gte: ['$$prof.pagmax', 2]} 
         ] 
        } 
       } 
      } 
     } 
    } 
]) 

Wenn Sie alle Dokumente mit leeren profili entfernen möchten nur eine weitere $match Bühne hinzu:

{ 
    $match: { 
     profili: { $nin: [[], null] } 
    } 
} 
+0

Hallo @TomG funktioniert der Code aber warum wird die Suche auch für andere Level gemacht? Die erste 'level: 1' ist kein Filter? Wenn ich nur die Ergebnisse von 'level: 1' sehe, füge ich' 'match'' mit' level: 1' hinzu. Und wo ich leer 'profili' und null 'profili' filtere. Wenn ich den Operator '$ or' bei' $ match' hinzufüge, funktioniert das nicht. Vielen Dank für Ihre Hilfe. – Francesco

+0

@Francesco Sorry, ich habe nicht gesehen, dass Sie 'level: 2' filtern wollten. Ich habe es zum ersten' $ match' hinzugefügt. Auch für das zweite '$ match' habe ich geändert, dass es leer und null' profili' ausfiltert – TomG

Verwandte Themen