dongsashe6006 2018-09-28 16:42
浏览 130
已采纳

提取具有多个条件的MongoDB收集记录

I want to fetch mongodb collection with multiple conditions but I am getting the error:

panic: Failed to parse: filter: [ { visibility: { $eq: "4" } }, { 
discontinued: { $ne: "1" } }, { status: { $eq: "1" } } ]. 'filter' field 
must be of BSON type Object.

The code is as follow:

package main

import (
    "fmt"
    "gopkg.in/mgo.v2/bson"
)

func GenerateFeed(headers, attributes interface{}, conditions 
[]interface{}) {
    var operations = []bson.M{}

    for _, val := range conditions {
        var attr, operator, value interface{}
        cons := val.(map[interface{}]interface{})
        for range cons {
            attr     = cons["attribute"]
            operator = cons["operator"]
            value    = cons["value"]

            switch operator {
                case "==":
                    operator = "$eq"
                case "!=":
                    operator = "$ne"
                case "()":
                    operator = "$in"
            }
        }
        operations = append(operations, bson.M{attr.(string): 
        bson.M{operator.(string): value}})
    }

    var products []Prod

    session := Connect()
    collection := session.DB("rfgv2").C("catalog_product_entity_1")
    err := collection.Find(operations).All(&products)
    CheckError(err)

    fmt.Println(products)
}

type Prod struct {
    EntityId                string  `bson:"entity_id"`
    Name                    string  `bson:"name"`
    TypeId                  string  `bson:"type_id"`
    Sku                     string  `bson:"sku"`
    Manufacturer            int32   `bson:"manufacturer"`
    Status                  int32   `bson:"status"`
    Visibility              int32   `bson:"visibility"`
    EnableGoogleCheckout    int32   `bson:"enable_google_checkout"`
    Delivery                string  `bson:"delivery"`
    MetaTitle               string  `bson:"meta_title"`
    MetaDescription         string  `bson:"meta_description"`
    Image                   string  `bson:"image"`
    SmallImage              string  `bson:"small_image"`
    Thumbnail               string  `bson:"thumbnail"`
    Gallery                 string  `bson:"gallery"`
    UrlKey                  string  `bson:"url_key"`
    UrlPath                 string  `bson:"url_path"`
    Mpn                     string  `bson:"mpn"`
    ProductListingAds       string  `bson:"product_listing_ads"`
    Color                   string  `bson:"color"`
    Price                   float32 `bson:"price"`
    Cost                    float32 `bson:"cost"`
    TierPriceForBundle      float32 `bson:"tier_price_for_bundle"`
    RegularPrice            float32 `bson:"regular_price"`
    SpecialFromDate         string  `bson:"special_from_date"`
    Description             string  `bson:"description"`
    MetaKeyword             string  `bson:"meta_keyword"`
    Dimensions              string  `bson:"dimensions"`
    Features                string  `bson:"features"`
    DeliveryPopupMessage    string  `bson:"delivery_popup_message"`
    CreatedAt               string  `bson:"created_at"`
    UpdatedAt               string  `bson:"updated_at"`
}

I am trying to fetch records based on multiple aggregate functions from mongodb with go. Basically if we remove the square brackets and try with mongo command it works, but how to fix this in go?

Thank You.

  • 写回答

1条回答 默认 最新

  • drze7794 2018-09-28 19:35
    关注

    The problem vas you were declaring the operationsas a []bson.M{}, so you're obtaining an array of maps.

    If you check the definition of bson.M{} it's a map[string]interface{} You just need to add elements to the map (in your case the operations you want). For do this, the syntax is yourMap[yourKey] = yourValue.

    Try the following code for the operations loop generation:

    operations := bson.M{}
    for _, val := range conditions {
        var attr, operator, value interface{}
        cons := val.(map[interface{}]interface{})
        for range cons {
            attr     = cons["attribute"]
            operator = cons["operator"]
            value    = cons["value"]
    
            switch operator {
                case "==":
                    operator = "$eq"
                case "!=":
                    operator = "$ne"
                case "()":
                    operator = "$in"
            }
        }
            operations[attr.(string)] = bson.M{operator.(string): value}
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容