У меня есть эта функция, которая использует официальный драйвер mongo-go (https://github.com/mongodb/mongo-go-driver)
func FindItemMongo(dataStruct interface{}, subItemKey string, collectionName string)(){
fmt.Println("inside FindDataMongo in Controller")
localDB := DB
coll := localDB.Collection(collectionName)
ctx, _ := context.WithTimeout(context.Background(), 5*time.Second)
var searchData []uint8
if subItemKey==""{
fmt.Println("inside no key searchData")
searchData, _ = bson.Marshal(bson.M{"data": dataStruct})
fmt.Println("value of searchData")
fmt.Println(searchData)
fmt.Println("value of reflect type of searchData")
fmt.Println(reflect.TypeOf(searchData))
}else{
reflectItem := reflect.ValueOf(dataStruct)
subItem := reflectItem.FieldByName(subItemKey)
subItemString := subItem.Interface().(string)
searchData, _ = bson.Marshal(bson.M{"data": bson.M{strings.ToLower(subItemKey): bson.M{"$eq": subItemString}}})
fmt.Println("value of searchData")
fmt.Println(searchData)
fmt.Println("value of reflect type of searchData")
fmt.Println(reflect.TypeOf(searchData))
}
cursor, err := coll.Find(ctx, searchData)
if err != nil {
log.Fatal(err)
}
defer cursor.Close(ctx)
var returnBson []map[string]interface{}
var result bson.M
for cursor.Next(ctx) {
err := cursor.Decode(&result)
if err != nil { log.Fatal(err) }
fmt.Println("value of found parsed")
fmt.Println(result)
returnBson = append(returnBson, result)
}
}
), который пытается найти данные в базе данных для двух условий, связанных с оператором if.Если subItemKey не определен, то он ищет точное совпадение с переданной структурой, если ключ определен, то он ищет совпадение в данных, используя оператор $eq
только для определенного поля.
Это работает для условия, когда subItemKey пуст. Например:
database.FindItemMongo(dataStruct, "", "users")
Дает
api | 1:36:55 app | value of found parsed
api | map[_id:ObjectID("8494398fsfd") data:map[email:qwer password:wer token:...]]
Однако, если я использую команду:
database.FindItemMongo(dataStruct, "Email", "users")
Я ничего не получаю.
Что-то не так с тем, как я определяю searchData в операторе else, и я не уверен, что. Кто-нибудь видит, что идет не так?
РЕДАКТИРОВАТЬ
Я должен отметить, что результат
unmarshalledSearch := bson.M{"data": bson.M{strings.ToLower(subItemKey): bson.M{"$eq": subItemString}}}
fmt.Println("value of unmarshalledSearch")
fmt.Println(unmarshalledSearch)
равен
api | value of unmarshalledSearch
api | map[data:map[email:map[$eq:qwer]]]
, который совпадает с форматом данных, возвращаемых иззапрос пустого поля. Это суть проблемы - если тПохоже, что searchData правильно отформатирован, почему курсор не возвращается ни с какими результатами?