我有这个简单的程序存储在名为坐标<的集合中的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:
通过将大写字母更改为小写来修复所有内容。
答案 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来计算所有输入文档的累计值。
最终结果将是一个只有一个文档的数组,其中_id
为null
,三个字段为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);
});
}
})