Tengo este programa simple que está almacenando en las variables MongoDB 3: X , Y y MENSAJE en una colección llamada coordenadas . Ahora necesito encontrar y usar las 10 últimas entradas desde allí. Descubrí que puedo hacerlo con collection.find({}).skip(collection.count() - 10) y luego convertirlo en matriz con .toArray(). Mi línea de código completa se ve así

var notesArray=collection.find({}).skip(collection.count() - 10).toArray;
    if (notesArray.length > 0) { console.log(notesArray[0]); }

Y en la consola muestra 'indefinido'. Lo que tengo que hacer es obtener una matriz de X , una matriz de Y y una matriz de MENSAJE , todos ellos con 10 últimos entradas? Necesitaré usar estos 10 x, y mensajes en otras funciones más adelante. Gracias de antemano.

EDITAR:

Después de poner collection.find().limit(3).toArray(function(err, docs) { console.log(docs); }) en el código, obtengo 3 primeros registros de la base de datos como este

[{_id: 5878f25df5cfe2d8002fdc72, x: 450, y: 265, mensaje: 'QQQQQQQQQQQQQQQQQQQQQQQq'},

{_id: 5878f263f5cfe2d8002fdc73, x: 1146, y: 245, mensaje: 'QQQQQQQQQQQQQQQQQQQQQQQq'},

{_id: 5878f267f5cfe2d8002fdc74, x: 216, y: 175, mensaje: 'QQQQQQQQQQQQQQQQQQQQQQQq QQQQ'}]

Creo que necesito hacerlo así collection.find().skip(collection.count() - 10).toArray(function(err, docs) { console.log(docs); }) pero luego aparece el error TypeError: callback is not a function

EDIT2:

Todo se solucionó cambiando las letras mayúsculas a minúsculas.

1
odinas1212 13 ene. 2017 a las 18:52

3 respuestas

La mejor respuesta

Puede usar el marco de agregación para obtener los resultados deseados. El siguiente ejemplo demuestra cómo puede ejecutar aggregate() canalización dentro de nodejs:

// Correctly call the aggregation framework using a pipeline in an Array.
var MongoClient = require('mongodb').MongoClient;

MongoClient.connect('mongodb://localhost:27017/test', function(err, db) {
    // Create a collection
    var collection = db.collection('coordinates');

    // Execute aggregate, notice the pipeline is expressed as an Array
    collection.aggregate([
        { "$sort": { "_id": -1 } },
        { "$limit": 10 },
        {
            "$group": {
                "_id": null,
                "x": { "$push": "$x" },
                "y": { "$push": "$y" },
                "message": { "$push": "$message" }
            }
        }
    ], function(err, notesArray) {
        console.log('X: ', notesArray[0].x);
        console.log('Y: ', notesArray[0].y);
        console.log('MESSAGE: ', notesArray[0].message);

        var firstX = notesArray[0].x[0];
        console.log(firstX);

        console.log(notesArray);
        db.close();
    });
});

La operación agregada anterior primero ordena los documentos en la colección por el campo _id usando el $sort operador de canalización. Desde la clasificación en un campo _id que almacena {{ X3}} valores es más o menos equivalente a ordenar por tiempo de creación, ustedpueden obtener los últimos documentos si el controlador MongoDB genera automáticamente un ObjectId para el campo _id en la creación de documentos. De lo contrario, si _id no es un {{X7 }} , deberá ordenar en un campo de marca de tiempo que denotala fecha y hora en que se creó el documento para determinar los últimos n documentos en una consulta.

El siguiente paso consiste en seleccionar los 10 documentos principales de la lista ordenada. Esto es posible con el {{X0} } operador.

Finalmente, agrupa todos los documentos y crea listas de datos para cada campo a través del $group canalización. El $push el operador del acumulador hace posible crear una matriz de valores del grupo en un campo específico. El campo _id en $group la etapa es obligatoria; sin embargo, puede especificar un valor _id de nulo para calcular los valores acumulados para todos los documentos de entrada en su conjunto como se indicó anteriormente.

El resultado final sería una matriz con un solo documento que tendrá un _id de null y los tres campos, es decir, una matriz de X, una matriz de Y y matriz de MESSAGE, todas ellas con 10 entradas más recientes:

notesArray = [
    {
        "_id": null,
        "X": [/* last 10 x values */],
        "Y": [/* last 10 y values */],
        "MESSAGE": [/* last 10 MESSAGE values */]
    }
]
1
chridam 13 ene. 2017 a las 18:03

Esto debería funcionar. Promesa de devolución de Mongo: debe llamar a la función then para acceder a los datos.

var url = 'mongodb://127.0.0.1:27017/my_db_name';
MongoClient.connect(url, function(err, db){
 if(!err){
   var collection = db.collection('coordinates');
   collection.find({},{_id : 0}, {limit : 10}).toArray().then(function(results){
    console.log(results);
   }).catch(function(err){
    console.log(err);
   });
 }
})
0
Mustafa Mamun 13 ene. 2017 a las 16:32

Necesita una devolución de llamada allí.

collection
    .find()
    .limit(10)
    .toArray(function(err, notesArray) {
        if (notesArray.length > 0)
            console.log(notesArray[0]);
    });

Más información en MongoDB docs .

EDITAR ( Para incluir la conexión db y el nombre de la colección )

Aquí está el código completo que necesitará:

var MongoClient = require('mongodb').MongoClient;

// Change the database URL and database name as per your requirement
MongoClient.connect("mongodb://localhost:27017/database_name", function(err, db) {

    if(err) return console.dir(err);

    var collection = db.collection('coordinates');

    collection
        .find()
        .limit(10)
        .toArray(function(err, notesArray) {
            if (notesArray.length > 0)
                console.log(notesArray[0]);
        });
});
0
Santanu Biswas 13 ene. 2017 a las 16:40