Heim > Backend-Entwicklung > Golang > Filterabfrage mongodb Golang

Filterabfrage mongodb Golang

WBOY
Freigeben: 2024-02-12 08:33:18
nach vorne
792 Leute haben es durchsucht

过滤查询 mongodb Golang

Der PHP-Editor Xigua stellt Ihnen heute die Golang-Implementierung der Filterabfrage Mongodb vor. Wenn wir die Mongodb-Datenbank für Datenabfragen verwenden, müssen wir häufig die Abfrageergebnisse filtern, um bestimmte Bedingungen zu erfüllen. Als leistungsstarke Programmiersprache bietet Golang eine umfangreiche Mongodb-Treiberbibliothek, mit der Filterabfragefunktionen problemlos implementiert werden können. Als nächstes stellen wir detailliert vor, wie man Mongodb zum Filtern von Abfragen in Golang verwendet, damit jeder diese Funktion besser anwenden und verstehen kann.

Frageninhalt

Ich versuche, eine Liste von Daten zu erhalten, die einer bestimmten Abfrage entsprechen, erhalte jedoch diese Fehlermeldung

"(atlaserror) merchant is not allowed or the syntax is incorrect, see
the atlas documentation for more information"
Nach dem Login kopieren
func ...

var result []*model.Package

    ctx, cancel := context.WithTimeout(ctx, 10*time.Second)
    defer cancel()

    tokenData, err := middleware.CtxValue(ctx)

    if err != nil {
        return nil, err
    }

    orQuery := []bson.M{}
    merchant := "abc"
    completedQuery := bson.M{"status": "completed"}
    cancelledQuery := bson.M{"status": "cancelled"}
    orQuery = append(
        orQuery,
        cancelledQuery,
        completedQuery)
    limit64 := int64(limit)
    page64 := int64(page)
    match := bson.M{"$match": bson.M{"$nor": orQuery}}
    var filterQuery primitive.M

    if tokenData.Role == "admin" && merchant != nil {
        filterQuery = bson.M{"merchant": bson.M{"id": merchant}}
    } else {
        filterQuery = bson.M{"user": bson.M{"id": tokenData.Id}}
    }
    paginatedData, err1 := paginate.New(r.Collection).Context(ctx).Limit(limit64).Page(page64).Aggregate(match, filterQuery)
    if err1 != nil {
        return nil, err1
    }


...
Nach dem Login kopieren

Lösung

filterquery,似乎包含 { "merchant" : { "id" : "abc" } },被单独传递给 .aggregate()。但是聚合框架期望接收代表一系列管道阶段的东西。 文档中概述了每个阶段,预计以 $ 字符开头,例如 $match Bühne.

Die Datenbank versucht gerade, merchant 作为管道的 options zu verarbeiten (siehe hier und hier). Eine solche Option gibt es jedoch nicht, daher die Fehlermeldung.

Um dieses Problem zu beheben, sollten Sie filterquery 逻辑合并到您正在构建和传递的现有 match 变量/阶段中。或者,您可以将 filterquery 包装在不同的 $match 中,然后将它们(作为单个参数)传递给 .aggregate().

Dieses Beispiel zeigt, wie sie mehrere Stufen erstellen und diese dann gemeinsam über mongo.pipeline{...}:mongo.pipeline{...}:

将它们一起提交给 .aggregate() an .aggregate() übermitteln
// create the stages
matchStage := bson.D{{"$match", bson.D{{"toppings", "milk foam"}}}}
unsetStage := bson.D{{"$unset", bson.A{"_id", "category"}}}
sortStage := bson.D{{"$sort", bson.D{
    {"price", 1},
    {"toppings", 1}},
}}
limitStage := bson.D{{"$limit", 2}}

// pass the stage into a pipeline
// pass the pipeline as the second paramter in the Aggregate() method
cursor, err := coll.Aggregate(context.TODO(), mongo.Pipeline{matchStage, unsetStage, sortStage, limitStage})
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonFilterabfrage mongodb Golang. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:stackoverflow.com
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage