MongoDB返回未定义的

时间:2017-01-13 15:52:46

标签: javascript arrays node.js mongodb

我有这个简单的程序存储在名为坐标<的集合中的MongoDB 3变量 - X Y MESSAGE / strong>即可。现在我需要从那里找到并使用10个最新条目。我发现我可以使用collection.find({}).skip(collection.count() - 10)执行此操作,然后使用.toArray()将其转换为数组。我的完整代码行看起来像这样

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

并在控制台中显示&#39; undefined&#39;。我需要做的是获得 X 的数组, Y 的数组,以及 MESSAGE 的数组,所有这些都包含10个最新的项?稍后我需要在其他函数中使用这些10 x,y和消息。提前谢谢。

修改

collection.find().limit(3).toArray(function(err, docs) { console.log(docs); })放入代码后,我从数据库中获得3条第一条记录

  

[{_id:5878f25df5cfe2d8002fdc72,        x:450,        y:265,        消息:&#39; QQQQQQQQQQQQQQQQQQQQQQQq&#39; },

     

{_id:5878f263f5cfe2d8002fdc73,        x:1146,        是:245,        消息:&#39; QQQQQQQQQQQQQQQQQQQQQQQq&#39; },

     

{_id:5878f267f5cfe2d8002fdc74,        x:216,        y:175,        消息:QQQQQQQQQQQQQQQQQQQQQQQq QQQQ&#39; }]

我想我需要像collection.find().skip(collection.count() - 10).toArray(function(err, docs) { console.log(docs); })这样做,但我得到错误 TypeError: callback is not a function

EDIT2:

通过将大写字母更改为小写来修复所有内容。

3 个答案:

答案 0 :(得分:1)

您可以使用聚合框架来获得所需的结果。以下示例演示了如何在nodejs中运行 aggregate() 管道:

// 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();
    });
});

上述聚合操作首先使用 $sort 管道运算符按_id字段对集合中的文档进行排序。由于对存储 ObjectId 值的_id字段进行排序大致相当于按创建时间排序,因此 如果MongoDB驱动程序在文档创建时自动为_id字段生成 ObjectId ,则能够获取最新文档。否则,如果_id不是 ObjectId ,则需要对表示时间戳的字段进行排序 创建文档的日期时间,以确定查询中的最后n个文档。

下一步需要从排序列表中选择前10个文档。这可以通过 $limit 运算符实现。

最后,您通过 $group 管道对所有文档进行分组并为每个字段创建数据列表。 $push 累加器运算符可以在指定字段上创建组中的值数组。 $group 阶段的_id字段是必填字段;但是,如上所述,您可以指定_id值为null来计算所有输入文档的累计值。

最终结果将是一个只有一个文档的数组,其中_idnull,三个字段为X数组,Y数组}和MESSAGE数组,所有这些都包含10个最新条目:

notesArray = [
    {
        "_id": null,
        "X": [/* last 10 x values */],
        "Y": [/* last 10 y values */],
        "MESSAGE": [/* last 10 MESSAGE values */]
    }
]

答案 1 :(得分:0)

你需要回调。

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

MongoDB docs中的更多信息。

编辑包含数据库连接和集合名称

以下是您需要的完整代码:

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]);
        });
});

答案 2 :(得分:0)

这应该可以解决问题。 Mongo返回承诺你必须调用then函数来访问数据。

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);
   });
 }
})