Фильтровать в golang mongodb

#mongodb #go

#mongodb #Вперед

Вопрос:

В настоящее время я учусь создавать restful api с golang и mongodb. На самом деле я новичок в обоих. Я использую mongodb-go-driver и я учусь использовать фильтр, когда мы хотим использовать find() функцию. Но у меня есть некоторые, которые я не понимаю. В чем разница между filter := bson.M{"_id": "abcd"} и filter := bson.M{{"_id": "abcd"}} ? Спасибо

Комментарии:

1. filter := bson.M{{"_id": "abcd"}} не компилируется, так что я не знаю, о чем вы спрашиваете. Может быть, вы имеете в виду filter := []bson.M{{"_id": "abcd"}} ? Это фрагмент, фрагмент «фильтров», наиболее часто используемый при указании этапов агрегации MongoDB.

2. @RiefSapthana. Я думаю, вы имели в виду filter := bson.D{{"_id": "abcd"}} . Используйте bson.D{{}} , когда важен порядок, например, несколько полей в фильтре запроса. Либо один, bson.D либо bson.M в виде фильтров, движок mongo достаточно умен, чтобы выдать вам тот же результат.

3. Спасибо @simagix @icza, что означают двойные фигурные скобки bson.D{{}} ? bson.M Имеет bson.M{{}} ли форма?

4. У меня есть такой пример, filter := bson.M{"_id": id} и этот filter := bson.D{{"name", "Ash"}} , так зачем bson.D использовать двойные фигурные скобки {{}} ? Что это значит?

Ответ №1:

Обратитесь к исходному коду, https://github.com/mongodb/mongo-go-driver/blob/master/bson/primitive/primitive.go

bson.D , внутренне является primitive.D , который является []primitive.E , который является struct . bson.M , внутренне является primitive.M , который является map[string]interface{} . Вы вводите ключ / значение в bson.M , но используете document (struct) в bson.D .

Лучше объяснить это, используя 2 параметра, например, поиск a = 1 and b = 2 . Ваш синтаксис будет таким: bson.M{"a": 1, "b": 2} или bson.D{{"a": 1}, {"b": 2}}

Ответ №2:

 //Filter Part
if filter != nil {
    if len(filter.Status) > 0 {
        query = append(query, bson.M{"status": bson.M{"$in": filter.Status}})

    }
}
d.Shared.BsonToJSONPrint(query)
//Getting Total count
totalCount, err := col.Find(func() bson.M {
    if query != nil {
        if len(query) > 0 {
            return bson.M{"$and": query}
        }
    }
    return bson.M{}
}
  

Ответ №3:

 
    var user []models.User

    var findQuery []bson.M

    coll := db.C(constants.USERTABLE)

    if name != nil {
        if len(name) > 0 {
            query = append(query, bson.M{"name": bson.M{"$in": name}})

        }
    }

    if status != nil {
        if len(status) > 0 {
            query = append(query, bson.M{"status": bson.M{"$in": status}})

        }
    }

    findQuery = append(findQuery, bson.M{"$match": func() bson.M {
        if query != nil {
            if len(query) > 0 {
                return bson.M{"$and": query}
            }
        }
        return bson.M{}
    }()})

    shared.BsonToJSONPrint(query)

    err = coll.Pipe(findQuery).All(amp;user)
    if err != nil {
        return nil, err
    }
    return user, nil
}
  

Ответ №4:

Клиент декодирует результат в bson.D документ по умолчанию, он представлен в виде массива, который не соответствует форме документа, которую мы хотим.

Чтобы перезаписать это поведение, вы должны декодировать в bson.M , который является простым map и имеет ту же форму документа в базе данных

 res := collection.FindOne(ctx, p.Where)

if res.Err() == mongo.ErrNoDocuments {
    return nil, nil
}
if res.Err() != nil {
        return nil, res.Err()
}
var document bson.M = make(bson.M) // important
err = res.Decode(document)