sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB elemMatch no funciona esperado

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.