No hay nada malo con el comportamiento de $elemMatch
. Funciona como se esperaba. El documento también dice:
Como regla general, cada vez que proyecta una array
usando $elemMatch
, solo uno de los elementos se proyectará como máximo . Si ninguno de los elementos de la matriz coincide, el campo no se proyectará en absoluto.
Entonces, el resultado que obtiene es correcto, solo el primer elemento en la matriz que coincidió con la condición en $elemMatch
será projected
.
{
"_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses" : [{
....
"StatusID": NumberLong(525623822633172993),
....
}]
}
Puede intentar cambiar el orden de los documentos en la matriz de estados y puede obtener un documento coincidente diferente si ese documento aparece delante de los otros documentos coincidentes en la matriz.
Consulte:$elemMatch
En cuanto a su requisito, si desea que todos los elementos de la matriz coincidan en su resultado, debe realizar una operación de agregación.
Match
aquellos documentos que tienen el _id requerido y aquellos documentos que contienen el subdocumento de estado que estamos buscando.unwind
la matriz de estados.- De nuevo
match
los documentos individuales desenrollados. - Finalmente
group
los documentos coincidentes por_id
.
El código:
db.collection.aggregate([
{$match:{ "_id": ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$unwind:"$Statuses"},
{$match:{"Statuses.StatusID":{$gte : NumberLong(525623822633172993)}}},
{$group:{"_id":"$_id",statuses:{$push:"$Statuses"}}}
])
lo que le dará todos los subdocumentos coincidentes en la matriz.