Maison  >  Article  >  développement back-end  >  Filtrer la requête mongodb Golang

Filtrer la requête mongodb Golang

WBOY
WBOYavant
2024-02-12 08:33:18736parcourir

过滤查询 mongodb Golang

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.

Contenu de la question

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"
étape
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
    }


...

Solution

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer