如果限制等于1,toArray()的替代方法是什么?

时间:2018-07-20 03:54:18

标签: node.js mongodb

private class OverlayPanel : Panel
{
    internal int WS_EX_TRANSPARENT = 0x00000020;
    public OverlayPanel(Control RefControl)
    {
        InitializeComponent();
        this.Size = new Size(RefControl.Size.Width - SystemInformation.VerticalScrollBarWidth,
                             RefControl.Size.Height - SystemInformation.HorizontalScrollBarHeight);
        this.Location = RefControl.Location;
    }
    private void InitializeComponent()
    {
        this.SetStyle(ControlStyles.Opaque | 
                      ControlStyles.ResizeRedraw |
                      ControlStyles.SupportsTransparentBackColor, true);
        this.SetStyle(ControlStyles.OptimizedDoubleBuffer, false);
        this.BorderStyle = BorderStyle.None;
    }

    protected override CreateParams CreateParams
    {
        get
        {
            CreateParams parameters = base.CreateParams;
            parameters.ExStyle |= WS_EX_TRANSPARENT;
            return parameters;
        }
    }
}

我不想转换为数组,因为该命令仅返回一条记录。如果我不使用toArray,它将抛出一个游标对象。我只想要从后端消耗的查询返回的数据并将其扔到前端。

怎么可能?一种简单的方法是遍历光标并在读取第一个也是唯一的文档后退出。与state.db .collection(`${collection}_TRENDING`) .find(paramsForFind) .sort({ timeStamp: -1 }) .limit(1) .toArray(); 循环相比,我更喜欢一种设计更好的方法。

使用的模块是:

for

1 个答案:

答案 0 :(得分:2)

toArray()的替代方法是forEach()

forEach()与toArray()

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

MongoClient.connect('mongodb://localhost:27017/crunchbase', function(err, db) {

assert.equal(err, null);
console.log("Successfully connected to MongoDB.");

var query = {
"category_code": "biotech"
};

db.collection('companies').find(query).toArray(function(err, docs) {

assert.equal(err, null);
assert.notEqual(docs.length, 0);

docs.forEach(function(doc) {
console.log(doc.name + " is a " + doc.category_code + " company.");
});

db.close();

});

});

请注意,调用.toArray使应用程序获取整个数据集。

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

MongoClient.connect('mongodb://localhost:27017/crunchbase', function(err, db) {

assert.equal(err, null);
console.log("Successfully connected to MongoDB.");

var query = {"category_code": "biotech"};

var cursor = db.collection('companies').find(query);

function(doc) {
cursor.forEach(
console.log( doc.name + " is a " + doc.category_code + " company." );
},
function(err) {
assert.equal(err, null);
return db.close();
}
);
});

请注意,由find()返回的游标已分配给var游标。通过这种方法,我们无需一次读取所有数据并立即使用数据,而是将数据流式传输到我们的应用程序。 find()可以立即创建一个游标,因为在我们尝试使用它将提供的某些文档之前,它实际上并不向数据库发出请求。游标的目的是描述我们的查询。 cursor.forEach的第二个参数显示了驾驶员精疲力尽或发生错误时的操作。

在上述代码的初始版本中,是toArray()强制了数据库调用。这意味着我们需要所有文档,并希望将它们放在一个数组中。

此外,MongoDB以批处理格式返回数据。下图显示了从游标(来自应用程序)到MongoDB的请求

enter image description here

  

forEach比toArray更好,因为我们可以将文档处理为   他们进来直到我们到达终点。与toArray进行对比-其中   我们等待所有文档被检索,整个数组   内置的。这意味着我们没有从以下事实中获得任何好处   驱动程序和数据库系统正在一起进行批处理   结果到您的应用程序。批处理旨在提高效率   在内存开销和执行时间方面。利用   如果可以的话,它。

如果您只想获取一份文档而不是使用findOne

try {
    state.db
        .collection(`${collection}_TRENDING`)
        .findOne(paramsForFind,{sort: { timeStamp: -1 }}, function (err, doc) {
            if (err) throw err;
            console.log("Result Document--->", doc);
        })
} catch (error) {
    console.log(error);
}

推荐findOne