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

Ordenación de Mongo en una condición calculada

Si desea "ponderar" los resultados según ciertos criterios o tener algún tipo de "valor calculado" dentro de una "clasificación", entonces necesita el .aggregate() método en su lugar. Esto permite que se utilicen valores "proyectados" en el $sort operación, para la cual solo se puede utilizar un campo presente en el documento:

db.messages.aggregate([
    { "$match": { "messages": userId } },
    { "$project": {
        "recipients": 1,
        "unread": 1,
        "content": 1,
        "readYet": {
            "$setIsSubset": [ [userId], "$unread" ] }
        }
    }},
    { "$sort": { "readYet": -1 } },
    { "$limit": 20 }
])

Aquí el $setIsSubset El operador permite la comparación de la matriz "no leída" con una matriz convertida de [userId] para ver si hay coincidencias. El resultado será true donde existe el ID de usuario o false donde no.

Esto luego se puede pasar a $sort , que ordena los resultados con preferencia a las coincidencias (el orden decreciente es true en la parte superior), y finalmente $limit simplemente devuelve los resultados hasta la cantidad especificada.

Entonces, para usar un término calculado para "ordenar", el valor debe "proyectarse" en el documento para que pueda ordenarse. El marco de agregación es cómo haces esto.

También tenga en cuenta que $elemMatch no se requiere solo para hacer coincidir un solo valor dentro de una matriz, y solo necesita especificar el valor directamente. Su propósito es donde se deben cumplir condiciones "múltiples" en un solo elemento de matriz, lo que por supuesto no se aplica aquí.