Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何将exec函数的stdout通过管道传输到另一个函数的读取器中?_Mongodb_Go_Amazon S3 - Fatal编程技术网

Mongodb 如何将exec函数的stdout通过管道传输到另一个函数的读取器中?

Mongodb 如何将exec函数的stdout通过管道传输到另一个函数的读取器中?,mongodb,go,amazon-s3,Mongodb,Go,Amazon S3,我正在尝试将标准输出从mongodump流式传输到s3。我已经掌握了S3任意长度流的语法,但是我不知道如何将这两个函数耦合起来。我不想在开始上传到S3之前处理整个mongodump命令。这就是我到目前为止所做的: dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive") dumpCmd.Stdout = os.Stdout uploader :=

我正在尝试将标准输出从mongodump流式传输到s3。我已经掌握了S3任意长度流的语法,但是我不知道如何将这两个函数耦合起来。我不想在开始上传到S3之前处理整个mongodump命令。这就是我到目前为止所做的:

dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive")
dumpCmd.Stdout = os.Stdout


uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String("us-east-1")}))
result, err := uploader.Upload(&s3manager.UploadInput{
    Body:   dumpCmd.Stdout,
    Bucket: aws.String("myBucket"),
    Key:    aws.String("myKey"),
})
if err != nil {
    log.Fatalln("Failed to upload", err)
}

log.Println("Successfully uploaded to", result.Location)

您可以使用
io.Copy
方法(),该方法定义如下:

本币副本

func副本(dst写入程序、src读取器)(写入int64,错误)

将副本从src复制到dst,直到src上达到EOF或 发生错误。它返回复制的字节数和第一个字节数 复制时遇到错误(如果有)

成功的复制返回err==nil,而不是err==EOF。因为拷贝是 定义为从src读取直到EOF,它不处理从读取的EOF 作为要报告的错误

如果src实现WriterTo接口,则复制由 调用src.WriteTo(dst)。否则,如果dst实现ReaderFrom 接口,通过调用dst.ReadFrom(src)来实现副本


您可以使用
io.Copy
方法(),该方法定义如下:

本币副本

func副本(dst写入程序、src读取器)(写入int64,错误)

将副本从src复制到dst,直到src上达到EOF或 发生错误。它返回复制的字节数和第一个字节数 复制时遇到错误(如果有)

成功的复制返回err==nil,而不是err==EOF。因为拷贝是 定义为从src读取直到EOF,它不处理从读取的EOF 作为要报告的错误

如果src实现WriterTo接口,则复制由 调用src.WriteTo(dst)。否则,如果dst实现ReaderFrom 接口,通过调用dst.ReadFrom(src)来实现副本

使用将命令的输出连接到上载的输入

这里有一个棘手的问题,即上传程序,但管道不支持搜索。为了避免这种情况,将在管道周围创建一个包装器,以对上传程序隐藏Seek方法

dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive")
body, err := dumpCmd.StdoutPipe()
if err != nil {
    // handle error
}

if err := dumpCmd.Start(); err != nil {
    // handle error
}

// Wrap the pipe to hide the seek methods from the uploader
bodyWrap := struct {
    io.Reader
}{body}

uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String("us-east-1")}))
result, err := uploader.Upload(&s3manager.UploadInput{
    Body:   bodyWrap,
    Bucket: aws.String("net-openwhere-mongodb-snapshots-dev"),
    Key:    aws.String("myKey"),
})
if err != nil {
    log.Fatalln("Failed to upload", err)
}

if err := dumpCmd.Wait(); err != nil {
   // handle error
}

log.Println("Successfully uploaded to", result.Location)
dumpCmd:=exec.Command(“mongodump”、“主机”、“端口”、“存档”)
正文,错误:=dumpCmd.StdoutPipe()
如果出错!=零{
//处理错误
}
如果错误:=dumpCmd.Start();呃!=零{
//处理错误
}
//包裹管道以对上载程序隐藏seek方法
包体:=struct{
读写器
}{body}
uploader:=s3manager.NewUploader(session.New(&aws.Config{Region:aws.String(“us-east-1”)}))
结果,错误:=uploader.Upload(&s3manager.UploadInput){
车身:裹身衣,
Bucket:aws.String(“net openwhere mongodb snapshots dev”),
Key:aws.String(“myKey”),
})
如果出错!=零{
log.Fatalln(“上传失败”,错误)
}
如果错误:=dumpCmd.Wait();呃!=零{
//处理错误
}
log.Println(“已成功上载到”,result.Location)
使用a将命令的输出连接到上传的输入

这里有一个棘手的问题,即上传程序,但管道不支持搜索。为了避免这种情况,将在管道周围创建一个包装器,以对上传程序隐藏Seek方法

dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive")
body, err := dumpCmd.StdoutPipe()
if err != nil {
    // handle error
}

if err := dumpCmd.Start(); err != nil {
    // handle error
}

// Wrap the pipe to hide the seek methods from the uploader
bodyWrap := struct {
    io.Reader
}{body}

uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String("us-east-1")}))
result, err := uploader.Upload(&s3manager.UploadInput{
    Body:   bodyWrap,
    Bucket: aws.String("net-openwhere-mongodb-snapshots-dev"),
    Key:    aws.String("myKey"),
})
if err != nil {
    log.Fatalln("Failed to upload", err)
}

if err := dumpCmd.Wait(); err != nil {
   // handle error
}

log.Println("Successfully uploaded to", result.Location)
dumpCmd:=exec.Command(“mongodump”、“主机”、“端口”、“存档”)
正文,错误:=dumpCmd.StdoutPipe()
如果出错!=零{
//处理错误
}
如果错误:=dumpCmd.Start();呃!=零{
//处理错误
}
//包裹管道以对上载程序隐藏seek方法
包体:=struct{
读写器
}{body}
uploader:=s3manager.NewUploader(session.New(&aws.Config{Region:aws.String(“us-east-1”)}))
结果,错误:=uploader.Upload(&s3manager.UploadInput){
车身:裹身衣,
Bucket:aws.String(“net openwhere mongodb snapshots dev”),
Key:aws.String(“myKey”),
})
如果出错!=零{
log.Fatalln(“上传失败”,错误)
}
如果错误:=dumpCmd.Wait();呃!=零{
//处理错误
}
log.Println(“已成功上载到”,result.Location)

我已经看过几次了,但我是一个完全的新手,不知道如何实现它。实际上,我认为这根本解决不了我的问题。uploader函数已经可以复制一个读卡器了,但是我没有读卡器,我有一个writer(dumpCmd.Stdout),我已经看过几次了,但是我是一个完全的新手,不知道如何实现它,实际上我认为这根本解决不了我的问题。uploader函数已经可以复制读卡器了,但是我没有读卡器,我有一个编写器(dumpCmd.Stdout),谢谢,这让我更接近于工作代码。新信息:上传程序在收到任何数据之前退出。我得到了一个0字节的文件,而预期大约600字节Meg@smiller171上传者报告的错误是什么?无错误:“2016/03/10 12:56:42成功上传到”我想是我的错误,一秒钟谢谢,让我更接近工作代码。新信息:上传程序在收到任何数据之前退出。我得到了一个0字节的文件,而预期大约600字节Meg@smiller171上传者报告的错误是什么?无错误:“2016/03/10 12:56:42成功上传到”“我认为这是我的错,一秒钟。”
dumpCmd := exec.Command("mongodump", "--host", "<host>", "--port", "<port>", "--archive")
body, err := dumpCmd.StdoutPipe()
if err != nil {
    // handle error
}

if err := dumpCmd.Start(); err != nil {
    // handle error
}

// Wrap the pipe to hide the seek methods from the uploader
bodyWrap := struct {
    io.Reader
}{body}

uploader := s3manager.NewUploader(session.New(&aws.Config{Region: aws.String("us-east-1")}))
result, err := uploader.Upload(&s3manager.UploadInput{
    Body:   bodyWrap,
    Bucket: aws.String("net-openwhere-mongodb-snapshots-dev"),
    Key:    aws.String("myKey"),
})
if err != nil {
    log.Fatalln("Failed to upload", err)
}

if err := dumpCmd.Wait(); err != nil {
   // handle error
}

log.Println("Successfully uploaded to", result.Location)