in server/datasource/mongo/kv/kv_dao.go [256:310]
func findKV(ctx context.Context, domain string, project string, opts datasource.FindOptions) (*mongo.Cursor, int, error) {
collection := dmongo.GetClient().GetDB().Collection(mmodel.CollectionKV)
ctx, cancel := context.WithTimeout(ctx, opts.Timeout)
defer cancel()
filter := bson.M{"domain": domain, "project": project}
if opts.Key != "" {
filter["key"] = opts.Key
switch {
case strings.HasPrefix(opts.Key, "beginWith("):
value := strings.ReplaceAll(getValue(opts.Key), ".", "\\.")
filter["key"] = bson.M{"$regex": "^" + value + ".*$", "$options": "$i"}
case strings.HasPrefix(opts.Key, "wildcard("):
value := strings.ReplaceAll(getValue(opts.Key), ".", "\\.")
value = strings.ReplaceAll(value, "*", ".*")
filter["key"] = bson.M{"$regex": "^" + value + "$", "$options": "$i"}
}
}
if len(opts.Labels) != 0 {
for k, v := range opts.Labels {
filter["labels."+k] = v
}
}
opt := options.Find().SetSort(map[string]interface{}{
"update_revision": -1,
})
if opts.Limit > 0 {
opt = opt.SetLimit(opts.Limit)
opt = opt.SetSkip(opts.Offset)
}
curTotal, err := collection.CountDocuments(ctx, filter)
if err != nil {
if err.Error() == context.DeadlineExceeded.Error() {
openlog.Error(MsgFindKvFailed, openlog.WithTags(openlog.Tags{
"timeout": opts.Timeout,
}))
return nil, 0, fmt.Errorf(FmtErrFindKvFailed, opts.Timeout)
}
return nil, 0, err
}
if opts.Status != "" {
filter["status"] = opts.Status
}
cur, err := collection.Find(ctx, filter, opt)
if err != nil {
if err.Error() == context.DeadlineExceeded.Error() {
openlog.Error(MsgFindKvFailed, openlog.WithTags(openlog.Tags{
"timeout": opts.Timeout,
}))
return nil, 0, fmt.Errorf(FmtErrFindKvFailed, opts.Timeout)
}
return nil, 0, err
}
return cur, int(curTotal), err
}