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.
Matchos documentos com o _id necessário e os documentos que contêm o subdocumento de status que estamos procurando.unwinda matriz de status.- Novamente
matchos documentos individuais desenrolados. - Finalmente
groupos 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.