将猫鼬流转换为数组

2024-03-29

我曾经使用过 mongodb,但对 mongoose ORM 还很陌生。我试图从集合中获取数据,explain() 输出显示 50 毫秒。通过 mongoose 获取数据的总时间为 9 秒。这是查询:

Node.find({'dataset': datasetRef}, function (err, nodes){
   // handle error and data here
});

然后我在我查询的字段上应用了索引。 explain() 输出现在显示 4ms。但通过 mongoose 检索数据的总时间没有改变。然后我搜索了一下,发现使用lean()可以帮助使mongoose中的读取查询性能非常接近原生mongodb

所以我将查询更改为:

Node.find({'dataset': datasetRef})
.lean()
.stream({transform: JSON.stringify})
.pipe(res)

这彻底解决了性能问题。但最终结果是一个 JSON 文档流,如下所示:

{var11: val11, var12: val12}{var21: val21, var22: val22} ...

我如何解析它以形成文档数组?或者我根本不应该使用流?在我看来,如果我计划在后端形成数组,那么使用流是没有意义的,因为我将不得不等待所有文档读入内存。但我也认为在前端解析和创建整个数组可能会很昂贵。

在这种情况下如何才能获得最佳性能而不堵塞网络?

UPDATE

我正在尝试使用直通流来解决这个问题。但是,我还无法在 JSON 对象之间插入逗号。请参阅下面的代码:

res.write("[");

var through = require('through');
var tr = through(
  function write(data){
    this.queue(data.replace(/\}\{/g,"},{"));
  }
);

var dbStream = db.node.find({'dataset': dataSetRef})
.lean()
.stream({'transform': JSON.stringify});

dbStream.on("end", function(){
    res.write("]");
});

dbStream
.pipe(tr)
.pipe(res);

这样,我就可以在开头得到“[”,在结尾得到“]”。但是,仍然无法将patten“}{”替换为“},{”。不确定我做错了什么

UPDATE 2

现在弄清楚为什么替换不起作用。看起来,由于我已将转换函数指定为 JSON.stringify,因此它一次读取一个 JSON 对象,因此永远不会遇到该模式}{因为它永远不会一次选择多个 JSON 元素。

现在我修改了代码,并编写了一个自定义转换函数,该函数执行 JSON.stringify,然后在末尾附加一个逗号。我在这里面临的唯一问题是我不知道它什么时候是流中的最后一个 JSON 对象。因为我不想在这种情况下添加逗号。目前,一旦遇到结尾,我就会追加一个空的 JSON 对象。但不知怎的,这看起来并不是一个令人信服的想法。这是代码:

res.write("[");
function transform(data){
    return JSON.stringify(data) + ",";
}

var dbStream = db.node.find({'dataset': dataSetRef})
.lean()
.stream({'transform': transform});

dbStream.on("end", function(){
    res.write("{}]");
});

dbStream
.pipe(res);

我在这里面临的唯一问题是我不知道它什么时候是流中的最后一个 JSON 对象。

但你确实知道哪个是第一个。您知道,您可以将其添加到除第一个对象之外的每个对象之前,而不是附加逗号。为此,请在闭包内设置转换函数:

function transformFn(){

    var first = true;

    return function(data) {

        if (first) {

            first = false;
            return JSON.stringify(data);
        }
        return "," + JSON.stringify(data);
    }
}

现在您可以调用该函数并将其设置为您的实际转换。

var transform = transformFn();
res.write("[");
var dbStream = db.node.find({'dataset': dataSetRef})
.lean()
.stream({'transform': transform});

dbStream.on("end", function(){
    res.write("]");
});

dbStream
.pipe(res);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将猫鼬流转换为数组 的相关文章

随机推荐

  • 如何在Picasso中清除缓存并重新加载图像?

    我在用Picasso在我的应用程序中加载图像 但我面临一个问题 我的图像URL是相同的 但图像正在改变backend调用相同的 URL 但是Picasso加载保存在缓存中的相同图像 现在我想清除该图像的缓存并再次重新加载图像 我尝试过的我搜
  • 在 Windows 10 上使用 mingw 进行 CMake:检测 CXX 编译器 ABI 信息 - 失败

    我想使用 cmake 在 Windows 10 上创建 MinGW Makefile 我已经安装了 mingw 并且可以毫无问题地使用 mingw32 make 和 g 命令 测试项目是一个超级简单的CMakeLists txt文件 cma
  • 版本控制压缩文件(docx、odt)

    有些格式实际上是伪装的 zip 文件 例如docx 或 odt 如果我将它们直接存储在版本控制中 它们将被作为二进制文件处理 我理想的解决方案是 有一个钩子可以创建一个foo docx 每个目录foo docx提交之前的文件 将所有文件解压
  • C中的多态性

    我正在用 C 语言设计一个程序来操作几何图形 如果每种类型的图形都可以由相同的基元操作 那将非常方便 我怎样才能在C中做到这一点 通常使用函数指针来完成此操作 换句话说 保存数据的简单结构and指向操作该数据的函数的指针 在 Bjarne
  • 恢复 Typescript 定义 Nuget 包

    我目前正在开发一个新项目 该项目将 Typescript 用于所有客户端代码 我使用许多纯 JavaScript 库来让它们与我的 Typescript 一起使用 我使用 Nuget 通过以下包管理器命令提取 d ts 文件 包管理器命令示
  • UserManager SendEmailAsync 未发送电子邮件

    我正在使用以下代码尝试异步发送电子邮件 但没有发送电子邮件 并且我不确定哪里做错了 我还在 web config 中添加了电子邮件协议的第二段代码 发送电子邮件异步代码 await UserManager SendEmailAsync us
  • Android 上的 AWS CloudWatch Log

    我正在尝试在 Android 应用程序中使用 AWS CloudWatch Log 我对 aws client 有以下配置 val basicAWSCredentials BasicAWSCredentials Xxxxxx Yyyyyy
  • 字符串交错的动态规划问题解决方案

    我试图解决这个问题 但我放弃了 找到了下面的解决方案 尽管我不明白该解决方案是如何工作的 或者为什么它有效 任何深入的解决方案将不胜感激 问题 Given s1 s2 s3 求是否s3由交错形成s1 and s2 例如 给定 s1 aabc
  • 如何从 python 中的命名元组中获取名称?

    我创建一个像这样的命名元组 from collections import namedtuple spam namedtuple eggs x y z ham spam 1 2 3 然后我可以使用例如访问火腿的元素 gt gt gt ham
  • 禁用部分内容的 CSS

    我正在使用 Yii bootstrap 扩展 但遇到一些样式问题 因为 bootstrap css 文件影响页面的主要内容 我的主要内容是使用 OpenLayers 完成的地图 因此我在它们之间混合样式时遇到了一些问题 我尝试做一个更通用的
  • 没有 v-model 的 Vue.JS 复选框

    尝试在不使用 v model 的情况下创建复选框
  • 服务层/存储库模式

    我正在使用 EF4 的服务层 存储库 工作单元模式构建一个 MVC 应用程序 我对逻辑有点困惑 我知道重点是解耦系统 但我有点困惑 因此 MVC 控制器调用服务来填充视图模型 那么可以肯定地说 MVC 应用程序耦合到服务层吗 然后服务层调用
  • sqlite3 - 插入 - javascript 对象作为值

    使用 javascript 对象作为 sqlite3 插入的值的最简单的解决方案是什么 下面的代码不起作用 const values name John age 34 language english db run INSERT INTO
  • 为什么 lodash 在否定函数中使用 switch-case? [复制]

    这个问题在这里已经有答案了 下面的代码是源码negateLodash 中的函数 我们可以看到 当参数长度小于4时 它使用switch case而不是使用apply直接地 这段代码有什么魔力呢 它会使性能更好吗 为什么分割点是4 functi
  • 如何更改 django runserver url?

    我正在尝试更改 django 项目 url 以便想要连接到局域网中网站的用户将看到 url 而不是 localhost 8000 或 127 0 0 1 我需要将 localhost 8000 users board 更改为http exa
  • Rails Engine + Mongoid:找不到名为“default”的会话的配置

    我创建了一个 Rails Mountable 应用程序并添加了 mongoid 和 rspec gem 如果我现在尝试运行我的规范 我会收到以下错误 Mongoid Errors NoSessionConfig Problem No con
  • HTML5 本地存储和变量类型

    我正在对 HTML5 中的本地存储进行一些测试 注意我使用的是 Safari 6 0 2 因为似乎许多 Web 引擎处理它们的方法不同 如果我这样做 localStorage setItem subTotal Number 12345 I
  • JavaScript 字符串连接速度

    有人可以向我解释一下这个吗 http jsperf com string concatenation 1 2 http jsperf com string concatenation 1 2 如果你很懒 我测试了 A 和 B A var i
  • ExecutorService workStealingPool 和取消方法

    您能想到为什么这段代码不起作用并且总是输出 完成 但第二个示例可以正常工作的任何原因吗 我正在使用最新的 JDK 8u45 public static class MyClass implements Runnable Override p
  • 将猫鼬流转换为数组

    我曾经使用过 mongodb 但对 mongoose ORM 还很陌生 我试图从集合中获取数据 explain 输出显示 50 毫秒 通过 mongoose 获取数据的总时间为 9 秒 这是查询 Node find dataset data