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
答案 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的请求
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