Não há nada de errado com o comportamento de
$elemMatch
. Funciona como esperado. O doc também diz:Como regra geral, sempre que você projeta um
array
usando $elemMatch
, apenas um dos elementos serão projetados no máximo . Se nenhum dos elementos na matriz corresponder, o campo não será projetado. Portanto, o resultado obtido está correto, apenas o primeiro item na matriz que corresponde à condição em
$elemMatch
será projected
. {
"_id" : ObjectId("5439a2992ea8cc0f70feef2d"),
"Statuses" : [{
....
"StatusID": NumberLong(525623822633172993),
....
}]
}
Você pode tentar alterar a ordem dos documentos na matriz de status e obter um documento correspondente diferente se esse documento aparecer antes dos outros documentos correspondentes na matriz.
Consulte:$elemMatch
Chegando ao seu requisito, se você quiser todos os elementos de matriz correspondentes em seu resultado, precisará executar uma operação de agregação.
Match
os documentos com o _id necessário e os documentos que contêm o subdocumento de status que estamos procurando.unwind
a matriz de status.- Novamente
match
os documentos individuais desenrolados. - Finalmente
group
os documentos correspondentes por_id
.
O 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"}}}
])
que lhe dará todos os subdocumentos correspondentes na matriz.