L'éditeur PHP Xigua vous présentera aujourd'hui l'implémentation Golang du filtrage des requêtes mongodb. Lorsque nous utilisons la base de données MongoDB pour une requête de données, nous devons souvent filtrer les résultats de la requête pour répondre à des conditions spécifiques. En tant que langage de programmation puissant, Golang fournit une riche bibliothèque de pilotes Mongodb, qui peut facilement implémenter des fonctions de filtrage de requêtes. Ensuite, nous présenterons en détail comment utiliser mongodb pour filtrer les requêtes dans Golang afin d'aider tout le monde à mieux appliquer et comprendre cette fonction.
J'essaie d'obtenir une liste de données correspondant à une requête spécifique mais j'obtiens cette erreur
"(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
.
La base de données essaie actuellement de traiter merchant
作为管道的 options
(voir ici et ici). Mais une telle option n'existe pas, d'où le message d'erreur.
Pour résoudre ce problème, vous devriez filterquery
逻辑合并到您正在构建和传递的现有 match
变量/阶段中。或者,您可以将 filterquery
包装在不同的 $match
中,然后将它们(作为单个参数)传递给 .aggregate()
.
Cet exemple 文档中的a> les montre en train de construire plusieurs étapes, puis de les soumettre ensemble à .aggregate()
via mongo.pipeline{...}
:mongo.pipeline{...}
:
.aggregate()
// 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})
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!