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.
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 } ...
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!