当我阅读文档时,我发现了以下注释:
当$ sort紧接在管道中的$ limit之前时,$ sort操作仅保持前n个结果,其中n是指定的限制,而MongoDB只需要在内存中存储n个项目.当allowDiskUse为true且n个项超过聚合内存限制时,此优化仍适用.
如果我对此是正确的,它仅适用于我同时使用$ sort和$ limit的情况
db.coll.aggregate([
...,
{$sort: ...},
{$limit: limit},
...
]);
Run Code Online (Sandbox Code Playgroud)
但是,我想我们大部分时间都会这样做
db.coll.aggregate([
...,
{$sort: ...},
{$skip: skip},
{$limit: limit},
...
]);
Run Code Online (Sandbox Code Playgroud)
问题1:如果我在这里使用$ skip,是否意味着上述规则不适用?
我问这个问题,因为理论上MongoDB仍然可以计算前n个记录,并通过只排序前n个记录来提高性能.我没有找到任何关于此的文件.如果规则不适用,
问题2:我是否需要将查询更改为以下内容以提高性能?
db.coll.aggregate([
...,
{$sort: ...},
{$limit: skip + limit},
{$skip: skip},
{$limit: limit},
...
]);
Run Code Online (Sandbox Code Playgroud)
编辑:我认为解释我的用例会使上面的问题更有意义.我正在使用MongoDB 2.6提供的文本搜索功能来查找产品.我担心如果用户输入一个非常常见的关键词,如"红色",将返回太多结果.因此,我正在寻找更好的方法来生成这个结果.
EDIT2:事实证明上面的最后一个代码等于
db.coll.aggregate([
...,
{$sort: ...},
{$limit: skip + limit},
{$skip: skip},
...
]);
Run Code Online (Sandbox Code Playgroud)
因此,我总是可以使用此表单来应用前n个规则.
说我有2种方法:
function A(callback) { ... }
function B(callback) { ... }
Run Code Online (Sandbox Code Playgroud)
我想执行:
function C();
A和B都完成后.
我们通常做的是将函数C放在回调中,如:
A(function() {
B(function() {
C();
});
});
Run Code Online (Sandbox Code Playgroud)
现在如果A和B都需要很长时间,我不希望B在A完成后执行.相反,我想同时启动它们以提高性能.
我在想的是实现类似信号量的东西(当然不是真正的信号量),它会在A和B都完成后触发事件.这样我就可以在活动中打电话给C.
我想知道的是,是否有任何库已实现上述功能?我相信我不是第一个想要这样做的人.
任何帮助表示赞赏.
我是MySQL的新手.所以我发现有人在我们的生产环境中写了一些SQL:
SELECT o.`erp_orders_id`
FROM `erp_orders` o
WHERE o.`orders_status`> 2
AND o.`orders_status`< 5
AND o.`shipmentAutoMatched` IN
(SELECT s.`shipmentID`
FROM `erp_shipment` s
WHERE s.`shipmentScanLocal` = 2)
Run Code Online (Sandbox Code Playgroud)
这里s.shipmentID
是int(11)
同时o.shipmentAutoMatched
的int(6)
.
此查询命中索引
IDX_OR_OR_CU(orders_status, orders_type, currency_type)
Run Code Online (Sandbox Code Playgroud)
虽然我实际上有另一个索引:
IDX_OR_SH(orders_status, shipmentAutoMatched)
Run Code Online (Sandbox Code Playgroud)
我认为可能更有效率.如果我将IN
指令更改为数字,如:
IN(10, 11, 12)
Run Code Online (Sandbox Code Playgroud)
在IDX_OR_SH
正确命中.所以我认为唯一的问题可能是关于int(11)
和int(6)
.
所以问题:
int(11)
,这个问题是如何发生的,它们实际上都存储为int(6)
int
INT32
说我有一个数组和一个函数A:
var array = ['a', 'b', 'c'];
function A(p) { ... };
Run Code Online (Sandbox Code Playgroud)
现在我想传递array
函数的每个项目A
,并希望它们按顺序执行.通常不会有任何问题.我可以:
array.forEach(function(item) {
A(item);
}
Run Code Online (Sandbox Code Playgroud)
但是,如果有一些异步操作A
,一切都搞砸了.所以问题是:
即使A中存在异步操作,如何才能使它们按顺序执行?
我的意思是,我想在A('a')完全结束后执行A('b')(包括那里的所有异步动作).
我想一定有一些公用事业公司已经做过这样的事了.有人能给我一些光明吗?