mongodb mongodb-query aggregation-framework

Agregue algún tipo de número de fila a un comando/tubería agregado mongodb



mongodb-query aggregation-framework (1)

La idea es devolver un tipo de número de fila a un comando / tubería agregado mongodb. Similar a lo que tenemos en un RDBM.

Debe ser un número único, no importante si coincide exactamente con una fila / número.

Para una consulta como:

[ { $match: { "author" : { $ne: 1 } }} , { $limit: 1000000 } ]

El regreso :

{ "rownum" : 0, "title" : "The Banquet", "author" : "Dante", "copies" : 2 } { "rownum" : 1, "title" : "Divine Comedy", "author" : "Dante", "copies" : 1 } { "rownum" : 2, "title" : "Eclogues", "author" : "Dante", "copies" : 2 } { "rownum" : 3, "title" : "The Odyssey", "author" : "Homer", "copies" : 10 } { "rownum" : 4, "title" : "Iliad", "author" : "Homer", "copies" : 10 }

¿Es posible generar este rownum en mongodb?


No estoy seguro sobre el rendimiento en grandes consultas, pero esta es al menos una opción.

Puede agregar sus resultados a una matriz agrupando / empujando y luego relajarse con includeArrayIndex esta manera:

[ {$match: {author: {$ne: 1}}}, {$limit: 10000}, {$group: { _id: 1, book: {$push: {title: ''$title'', author: ''$author'', copies: ''$copies''}} }}, {$unwind: {path: ''$book'', includeArrayIndex: ''rownum''}}, {$project: { author: ''$book.author'', title: ''$book.title'', copies: ''$book.copies'', rownum: 1 }} ]

Ahora, si su base de datos contiene una gran cantidad de registros, y tiene la intención de paginar, puede usar la etapa $ skip y luego $ limit 10 o 20 o lo que quiera mostrar por página, y simplemente agregue el número de $ skip avance hacia su rownum y obtendrá la posición real sin tener que empujar todos sus resultados para enumerarlos.