小编yao*_*ing的帖子

聚合框架中的$ skip和$ limit

当我阅读文档时,我发现了以下注释:

当$ 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个规则.

mongodb aggregation-framework

38
推荐指数
3
解决办法
3万
查看次数

nodejs:在执行之前等待其他方法完成

说我有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.

我想知道的是,是否有任何库已实现上述功能?我相信我不是第一个想要这样做的人.
任何帮助表示赞赏.

javascript node.js

6
推荐指数
1
解决办法
2万
查看次数

int(11)和int(6)会导致索引问题吗?

我是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.shipmentIDint(11)同时o.shipmentAutoMatchedint(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).

所以问题:

  1. 我对么?
  2. 当这两个问题发生时int(11),这个问题是如何发生的,它们实际上都存储为int(6)intINT32
  3. 我该如何解决这个问题?

mysql sql

6
推荐指数
1
解决办法
100
查看次数

按顺序执行对数组项的函数

说我有一个数组和一个函数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')(包括那里的所有异步动作).

我想一定有一些公用事业公司已经做过这样的事了.有人能给我一些光明吗?

javascript arrays asynchronous node.js

3
推荐指数
1
解决办法
176
查看次数