mongodb получает 10_000 строк одновременно - PullRequest
0 голосов
/ 27 апреля 2020

Я пытаюсь получить 10000 документов одновременно в mongodb, но я получил:

Информация:

код:


package main

import (
    "context"
    "fmt"
    "net/http"
    "os"
    "time"

    "go.mongodb.org/mongo-driver/bson"
    "go.mongodb.org/mongo-driver/mongo"
    "go.mongodb.org/mongo-driver/mongo/options"
)

var database *mongo.Database

func main() {

    ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
    client, err := mongo.Connect(ctx, options.Client().ApplyURI("mongodb://20.20.20.43:27017"))
    if err != nil {
        panic(err)
    }

    database = client.Database("chat_data")

    chatText := make([]chat, 0)
    now := time.Now().Unix()
    ctx, _ = context.WithTimeout(context.Background(), 30*time.Second)

    // mongodb batch option
    opt := options.Find()
    opt.SetBatchSize(15_000)
    opt.SetAllowPartialResults(false)

    // mongodb filter
    filter := bson.M{"timestamp": bson.M{"$gte": now - 108000}}

    cur, err := database.Collection("chat").Find(ctx, filter, opt)
    if err != nil {
        // fmt.Fprint(w, err)
        fmt.Println(err)
        return
    }
    defer cur.Close(ctx)

    for cur.Next(ctx) {
        var result chat
        err := cur.Decode(&result)
        if err != nil {
            fmt.Println(err)
            continue
        }
        // do something with result....
        // fmt.Println(result)
        chatText = append(chatText, result)
    }
    if err := cur.Err(); err != nil {
        // fmt.Fprint(w, cur.Err())
        fmt.Println(err)
        return
    }

    fmt.Println("done")
    fmt.Println(len(chatText))
}

Могу ли я достичь этого с помощью драйвера mongodb & go?, всегда достигается 30-секундный таймаут

Редактировать 1

Я пытаюсь python (с pymon go), это нужно только 0m2.159s для запроса 36k сделать c с этим фильтром

Ответы [ 2 ]

0 голосов
/ 28 апреля 2020

Вы запрашиваете только поле timestamp. Если вы сначала создадите индекс для этой коллекции с полем timestamp, вы получите более быстрые результаты и получите бесплатную сортировку в процессе.

0 голосов
/ 27 апреля 2020

Попробуйте 7000, если это работает, попробуйте 12000, если это не работает, попробуйте 4000, и т. Д. c.

Запишите, сколько времени потребуется этим запросам, чтобы выяснить, пропорционально ли время выполнения размер партии.

...