[英]Golang mongoDB search document
我開始學習 mongoDB 並嘗試通過一些參數搜索用戶,用戶名、名字、姓氏。 在下面的示例中,我可以按用戶名搜索用戶並獲取數據。
// Search users
func (r *Mongo) Search(ctx context.Context, query string) ([]*User, error) {
findOptions := options.Find()
// Sort by `username` field descending
findOptions.SetSort(bson.D{{"username", -1}})
filter := bson.M{"username": bson.M{"$regex": query, "$options": "i"}}
cursor, err := r.col.Find(ctx, filter, findOptions)
if err != nil {
return nil, err
}
var results []*User
if err = cursor.All(ctx, &results); err != nil {
return nil, err
}
return results, nil
}
以下示例搜索多個參數,但結果為空。
// Search users
func (r *Mongo) Search(ctx context.Context, query string) ([]*User, error) {
findOptions := options.Find()
// Sort by `username` field descending
findOptions.SetSort(bson.D{{"username", -1}})
filter := bson.M{
"username": bson.M{"$regex": query, "$options": "i"},
"$or": []interface{}{
bson.M{"firstname": bson.M{"$regex": query, "$options": "i"}},
bson.M{"lastname": bson.M{"$regex": query, "$options": "i"}},
},
}
// filter := bson.M{"username": bson.M{"$regex": query, "$options": "i"}}
cursor, err := r.col.Find(ctx, filter, findOptions)
if err != nil {
return nil, err
}
var results []*User
if err = cursor.All(ctx, &results); err != nil {
return nil, err
}
return results, nil
}
問題,如何通過多個參數進行搜索(使用 $or)?
這個搜索選項是最優且正確的,還是在 MongoDB 中是否有更正確的搜索選項,類似於 SQL 中的 LIKE?
提前感謝您的回答。
如果有人需要通過多個參數進行搜索,這可能很有用:我將過濾器程序集放在一個單獨的方法中
func (r *Mongo) queryBuilderFilter(query *Query) bson.M {
var andFilters []bson.M
if query.Query != "" {
orFilters := []bson.M{
{
"username": bson.M{"$regex": primitive.Regex{Pattern: "^" + query.Query + "*", Options: "i"}},
},
{
"firstname": bson.M{"$regex": primitive.Regex{Pattern: "^" + query.Query + "*", Options: "i"}},
},
{
"lastname": bson.M{"$regex": primitive.Regex{Pattern: "^" + query.Query + "*", Options: "i"}},
},
}
andFilters = append(andFilters, bson.M{"$or": orFilters})
}
if len(andFilters) == 0 {
// Handle empty and, since there must be one item.
return bson.M{}
}
return bson.M{"$and": andFilters}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.