我想获取具有多个条件的mongodb集合,但出现错误:
panic: Failed to parse: filter: [ { visibility: { $eq: "4" } }, {
discontinued: { $ne: "1" } }, { status: { $eq: "1" } } ]. 'filter' field
must be of BSON type Object.
代码如下:
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"`
}
我正在尝试使用go从mongodb获取基于多个聚合函数的记录。基本上,如果我们删除方括号并尝试使用mongo命令,它会起作用,但是如何在go中解决此问题?
谢谢。
答案 0 :(得分:1)
您将operations
声明为[]bson.M{}
的问题所在,因此您获得了一组地图。
如果您检查bson.M {}的definition,则是map [string]接口{}
您只需要向地图添加元素(就您而言,您想要的操作)。为此,语法为yourMap[yourKey] = yourValue
。
尝试以下代码来生成操作循环:
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}
}