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.
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
@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