我曾与mongodb合作,但对mongoose ORM还是很陌生。我试图从集合中获取数据,explain()输出显示50ms。通过猫鼬获取数据的总时间为9秒。这是查询:
Node.find({'dataset': datasetRef}, function (err, nodes){
// handle error and data here
});
Run Code Online (Sandbox Code Playgroud)
然后,我在要查询的字段上应用了索引。现在explain()输出显示为4ms。但是通过猫鼬检索数据的总时间没有改变。然后我搜索了一下,发现使用lean()可以帮助使mongoose中的读取查询性能与本地mongodb非常接近
所以我将查询更改为:
Node.find({'dataset': datasetRef})
.lean()
.stream({transform: JSON.stringify})
.pipe(res)
Run Code Online (Sandbox Code Playgroud)
这样就完全解决了性能问题。但是最终结果是像这样的JSON文档流:
{var11: val11, var12: val12}{var21: val21, var22: val22} ...
Run Code Online (Sandbox Code Playgroud)
我如何解析它形成文档数组?还是我根本不应该使用流?我认为,如果我打算在后端形成数组,则没有必要使用流,因为那样我将不得不等待所有文档都读入内存。但我也认为,在前端解析和创建整个数组可能会很昂贵。
在这种情况下,如何在不堵塞网络的情况下获得最佳性能?
更新
我正在尝试使用直通流解决此问题。但是,我还不能在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);
Run Code Online (Sandbox Code Playgroud)
这样,我就可以在开头获得“ [”,在结尾获得“]”。但是,仍然无法将样式“} {”替换为“},{”。不知道我在做什么错
更新2
现在找出为什么替换无法正常工作。看来,由于我已将transform函数指定为JSON.stringify,因此它一次只能读取一个JSON对象,因此永远不会遇到该模式,}{因为它一次不会选择多个JSON元素。
现在,我修改了代码,并编写了一个自定义转换函数,该函数执行JSON.stringify,然后在末尾添加逗号。我在这里面临的唯一问题是我不知道它何时是流中的最后一个JSON对象。因为我不想在这种情况下附加逗号。目前,遇到结尾时,我会添加一个空的JSON对象。但是,这看起来并不令人信服。这是代码:
res.write("[");
function transform(data){
return JSON.stringify(data) + ",";
} …Run Code Online (Sandbox Code Playgroud) 请考虑以下文档
{
"title": "My first blog entry",
"text": "Starting to get the hang of this...",
"tags": [ "testing" ],
"views": 0
}
Run Code Online (Sandbox Code Playgroud)
我需要运行一种upsert操作.如果我遇到像这样的数据
{
"id": 1,
"tags": [ "new tag" ]
}
Run Code Online (Sandbox Code Playgroud)
我想更新具有相同ID的现有文档.所以结果应该是:
{
"id": 1,
"title": "My first blog entry",
"text": "Starting to get the hang of this...",
"tags": [ "testing", "new tag" ],
"views": 0
}
Run Code Online (Sandbox Code Playgroud)
如果不存在具有相同id的文档,我想创建一个新文档.
现在在像mongoDB这样的数据库中,我可以使用$ addToSet或$ push操作进行更新.我在Elasticsearch中找不到类似的操作.
我读到它可以通过在groovy中编写脚本来完成.但是,这需要在包含2亿条记录的文件上完成.我不确定我是否可以将groovy与批量API结合使用.可能吗 ?
我有一个包含超过 1 亿行的 MySQL 表。该表是一个生产表,大量读取请求均由该表提供服务。我需要从此表中获取一百万行,在 Node.js 脚本中处理这些行,然后将数据存储到 Elasticsearch。
我已经用 MongoDB 做过很多次了,没有遇到任何问题。我启动一个读取流,并在每读取 1000 行后继续暂停该流,一旦这组 1000 行的下游过程完成,我将恢复该流并继续执行操作,直到处理完所有行。我没有遇到任何 MongoDB 性能挑战,因为find查询返回一个批量获取结果的游标。因此,无论我的输入有多大,都不会造成任何问题。
现在,我不知道MySQL 中的流查询在幕后是如何工作的。我的方法适用于 MySQL 还是我必须一次又一次地执行查询,例如第一个选择查询获取这些行where id < 1000,下一个查询获取结果where id between 1000 and 2000等等。以前有人研究过类似的问题。我在 Stackoverflow 上发现了类似的问题,但没有答案。
我在Ubuntu 14.04上使用Cassandra.从文档中,我可以看到运行命令:
nodetool snapshot <keyspace name>
Run Code Online (Sandbox Code Playgroud)
创建我的键空间的快照.
该命令的输出是:
nodetool snapshot my_keyspace
Requested creating snapshot(s) for [my_keyspace] with snapshot name [1455455429118]
Snapshot directory: 1455455429118
Run Code Online (Sandbox Code Playgroud)
根据文档,快照应该出现在目录中:
/var/lib/cassandra/data/my_keyspace/<table names>/snapshots/1455455429118
Run Code Online (Sandbox Code Playgroud)
但是,表名末尾有一些哈希值.
我不确定它来自何处,也不确定该值是否始终相同.例如,表名是user_agents,快照目录是:
/var/lib/cassandra/data/my_keyspace/user_agents-147c8cc0d31c11e5aacb3b02dd594b59/snapshots/1455455429118
Run Code Online (Sandbox Code Playgroud)
我不确定147c8cc0d31c11e5aacb3b02dd594b59代表什么.
我试图自动化这个过程,如果我不知道这个随机哈希值,就不可能知道要选择哪个目录.有没有办法从nodetool命令的输出中禁用它或解密它?
我正在使用Promise.map处理数组。对于每个元素,我正在执行一个异步操作,该操作返回一个Promise。但是,我想在每次调用之间引入一些延迟,因为下游对请求数量有限制。这是我想做的
return Promise.map(array, function (elem){
// perform an async call using elem
// wait for 500 ms
})
Run Code Online (Sandbox Code Playgroud)
我怎样才能达到同样的目的?
我正在使用带有标签的无限循环。在 for 循环的范围之外,我有一个作为 go 例程运行的预定函数。当满足某个条件时,我想从预定函数中中断 for 循环。我怎样才能做到这一点?这就是我正在尝试的,由于范围问题,这显然不起作用。
package main
import (
"fmt"
"time"
"sync"
)
func main() {
count := 0
var wg sync.WaitGroup
wg.Add(1)
t := time.NewTicker(time.Second*1)
go func (){
for {
fmt.Println("I will print every second", count)
count++
if count > 5 {
break myLoop;
wg.Done()
}
<-t.C
}
}()
i := 1
myLoop:
for {
fmt.Println("iteration", i)
i++
}
wg.Wait()
fmt.Println("I will execute at the end")
}
Run Code Online (Sandbox Code Playgroud) 考虑docker-compose.yml这样一个文件:
version: '3'
services:
test:
image: ubuntu:18.04
tty: true
Run Code Online (Sandbox Code Playgroud)
我可以通过运行在后台启动服务docker-compose up -d
现在我可以使用以下命令在此容器上运行命令docker-compose exec
例如:
docker-compose exec test ls -lrt | head -3
Run Code Online (Sandbox Code Playgroud)
当我运行上面的命令时,我在终端上得到输出
total 64
drwxr-xr-x 8 root root 4096 May 23 2017 lib
drwxr-xr-x 2 root root 4096 Apr 24 2018 home
Run Code Online (Sandbox Code Playgroud)
现在我想要的是能够在后台运行上面的命令,我可以用它来做
docker-compose exec -d test ls -lrt | head -3
Run Code Online (Sandbox Code Playgroud)
该命令将在后台运行,这很好。但是我如何访问上述命令的输出呢?
根据 RIPE REST API 文档,需要按以下格式指定请求:
http://rest.db.ripe.net/ {source}/{objecttype}/{key}
所以我假设查找 IP 地址将如下所示:
然而,我得到的回应是:
{
"link": {
"type": "locator",
"href": "http://rest.db.ripe.net/ripe/inetnum/193.0.6.142"
},
"errormessages": {
"errormessage": [
{
"severity": "Error",
"text": "ERROR:101: no entries found\n\nNo entries found in source %s.\n",
"args": [
{
"value": "RIPE"
}
]
}
]
},
"terms-and-conditions": {
"type": "locator",
"href": "http://www.ripe.net/db/support/db-terms-conditions.pdf"
}
}
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么 ?
我需要使用Object字段创建一个Elasticsearch映射,该字段的密钥事先是未知的.此外,值可以是整数或字符串.但我希望将值存储为非分析字段(如果它们是字符串).我尝试了以下映射:
PUT /my_index/_mapping/test
{
"properties": {
"alert_text": {
"type": "object",
"index": "not_analyzed"
}
}
}
Run Code Online (Sandbox Code Playgroud)
现在索引创建得很好.但是,如果我插入这样的值:
POST /my_index/test
{
"alert_text": {
"1": "hello moto"
}
}
Run Code Online (Sandbox Code Playgroud)
使用标准分析仪将值"hello moto"存储为分析字段.我希望它存储为非分析字段.如果我事先不知道所有钥匙都可以出现,是否可能?