Heim  >  Artikel  >  Backend-Entwicklung  >  Filterabfrage mongodb Golang

Filterabfrage mongodb Golang

WBOY
WBOYnach vorne
2024-02-12 08:33:18736Durchsuche

过滤查询 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"
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
    }


...

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 文档中的a> 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})

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

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen