MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

ElemMatch do MongoDB não funciona esperado


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.