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

Filtrer la requête mongodb Golang

WBOY
Libérer: 2024-02-12 08:33:18
avant
780 Les gens l'ont consulté

过滤查询 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"
Copier après la connexion
é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
    }


...
Copier après la connexion

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 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})
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal