#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)