You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@servicecomb.apache.org by ti...@apache.org on 2021/03/18 06:25:50 UTC

[servicecomb-service-center] branch master updated: [SCB-2094] Restructure database/mongo (#896)

This is an automated email from the ASF dual-hosted git repository.

tianxiaoliang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/servicecomb-service-center.git


The following commit(s) were added to refs/heads/master by this push:
     new c063b9a  [SCB-2094] Restructure database/mongo (#896)
c063b9a is described below

commit c063b9a1b79ea98c98f283ab481ad88c96c798c5
Author: robotLJW <79...@qq.com>
AuthorDate: Thu Mar 18 14:25:43 2021 +0800

    [SCB-2094] Restructure database/mongo (#896)
    
    1.create dao
---
 datasource/account.go                              |   8 +-
 datasource/account_test.go                         |   4 +-
 datasource/etcd/account.go                         |  13 +-
 datasource/mongo/account.go                        |  64 +-
 datasource/mongo/client/common.go                  |   1 +
 datasource/mongo/client/dao/instance.go            |  95 ++
 datasource/mongo/client/dao/microservice.go        | 108 +++
 datasource/mongo/client/dao/rule.go                |  85 ++
 datasource/mongo/client/dao/schema.go              |  81 ++
 .../checker/heartbeat.go => client/dao/tag.go}     |  32 +-
 datasource/mongo/client/errortypes.go              |   6 -
 datasource/mongo/{ => client}/model/types.go       |   0
 datasource/mongo/dep.go                            |  40 +-
 datasource/mongo/dep_util.go                       |   7 +-
 datasource/mongo/dependency_query.go               | 107 ++-
 datasource/mongo/engine.go                         |   8 +-
 datasource/mongo/event/instance_event_handler.go   |   5 +-
 .../mongo/event/instance_event_handler_test.go     |   2 +-
 datasource/mongo/heartbeat/cache/heartbeat.go      |  25 +-
 datasource/mongo/heartbeat/cache/heartbeat_test.go |   2 +-
 .../mongo/heartbeat/cache/heartbeatcache_test.go   |   6 +-
 datasource/mongo/heartbeat/checker/heartbeat.go    |   9 +-
 .../mongo/heartbeat/checker/heartbeat_test.go      |  20 +-
 .../heartbeat/checker/heartbeatchecker_test.go     |  12 +-
 datasource/mongo/mongo.go                          |  14 +-
 datasource/mongo/ms.go                             | 966 ++++++---------------
 datasource/mongo/ms_test.go                        |   2 +-
 datasource/mongo/role.go                           |  46 +-
 datasource/mongo/rule_util.go                      |   8 +-
 datasource/mongo/rule_util_test.go                 |   2 +-
 datasource/mongo/sd/listwatch_inner.go             |   2 +-
 datasource/mongo/sd/listwatch_test.go              |   2 +-
 datasource/mongo/sd/mongo_cacher.go                |   2 +-
 datasource/mongo/sd/mongo_cacher_test.go           |   2 +-
 datasource/mongo/system.go                         |   2 +-
 datasource/mongo/system_test.go                    |   2 +-
 datasource/mongo/util.go                           |  31 +-
 datasource/mongo/util/db.go                        | 277 +++++-
 datasource/mongo/util/string.go                    |   2 +-
 39 files changed, 1138 insertions(+), 962 deletions(-)

diff --git a/datasource/account.go b/datasource/account.go
index c5a2df7..70faaa0 100644
--- a/datasource/account.go
+++ b/datasource/account.go
@@ -24,9 +24,11 @@ import (
 )
 
 var (
-	ErrAccountDuplicated = errors.New("account is duplicated")
-	ErrAccountCanNotEdit = errors.New("account can not be edited")
-	ErrDLockNotFound     = errors.New("dlock not found")
+	ErrAccountDuplicated   = errors.New("account is duplicated")
+	ErrAccountCanNotEdit   = errors.New("account can not be edited")
+	ErrDLockNotFound       = errors.New("dlock not found")
+	ErrDeleteAccountFailed = errors.New("failed to delete account")
+	ErrQueryAccountFailed  = errors.New("failed to query account")
 )
 
 // AccountManager contains the RBAC CRUD
diff --git a/datasource/account_test.go b/datasource/account_test.go
index f7bce08..b61845d 100644
--- a/datasource/account_test.go
+++ b/datasource/account_test.go
@@ -52,10 +52,12 @@ func TestAccount(t *testing.T) {
 	t.Run("add and get account", func(t *testing.T) {
 		err := datasource.Instance().CreateAccount(context.Background(), &a1)
 		assert.NoError(t, err)
+		err = datasource.Instance().CreateAccount(context.Background(), &a2)
+		assert.NoError(t, err)
 		r, err := datasource.Instance().GetAccount(context.Background(), a1.Name)
 		assert.NoError(t, err)
 		assert.Equal(t, a1, *r)
-		_, err = datasource.Instance().DeleteAccount(context.Background(), []string{a1.Name})
+		_, err = datasource.Instance().DeleteAccount(context.Background(), []string{a1.Name, a2.Name})
 		assert.NoError(t, err)
 	})
 	t.Run("account should exist", func(t *testing.T) {
diff --git a/datasource/etcd/account.go b/datasource/etcd/account.go
index 0b677c2..d954959 100644
--- a/datasource/etcd/account.go
+++ b/datasource/etcd/account.go
@@ -121,12 +121,15 @@ func (ds *DataSource) DeleteAccount(ctx context.Context, names []string) (bool,
 	if len(names) == 0 {
 		return false, nil
 	}
-	resp, err := client.Instance().Do(ctx, client.DEL,
-		client.WithStrKey(path.GenerateRBACAccountKey(names[0])))
-	if err != nil {
-		return false, err
+	for _, name := range names {
+		_, err := client.Instance().Do(ctx, client.DEL,
+			client.WithStrKey(path.GenerateRBACAccountKey(name)))
+		if err != nil {
+			log.Error(datasource.ErrDeleteAccountFailed.Error(), err)
+			return false, err
+		}
 	}
-	return resp.Succeeded, nil
+	return true, nil
 }
 func (ds *DataSource) UpdateAccount(ctx context.Context, name string, account *rbac.Account) error {
 	value, err := json.Marshal(account)
diff --git a/datasource/mongo/account.go b/datasource/mongo/account.go
index 99b1678..c4e816c 100644
--- a/datasource/mongo/account.go
+++ b/datasource/mongo/account.go
@@ -19,14 +19,13 @@ package mongo
 
 import (
 	"context"
-	"errors"
+	"fmt"
 
 	"github.com/go-chassis/cari/rbac"
-	"go.mongodb.org/mongo-driver/bson"
 
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/log"
 	"github.com/apache/servicecomb-service-center/pkg/privacy"
@@ -36,7 +35,8 @@ import (
 func (ds *DataSource) CreateAccount(ctx context.Context, a *rbac.Account) error {
 	exist, err := ds.AccountExist(ctx, a.Name)
 	if err != nil {
-		log.Error("can not save account info", err)
+		msg := fmt.Sprintf("failed to query account, account name %s", a.Name)
+		log.Error(msg, err)
 		return err
 	}
 	if exist {
@@ -44,7 +44,8 @@ func (ds *DataSource) CreateAccount(ctx context.Context, a *rbac.Account) error
 	}
 	a.Password, err = privacy.HashPassword(a.Password)
 	if err != nil {
-		log.Error("pwd hash failed", err)
+		msg := fmt.Sprintf("failed to hash account pwd, account name %s", a.Name)
+		log.Error(msg, err)
 		return err
 	}
 	a.ID = util.GenerateUUID()
@@ -55,14 +56,12 @@ func (ds *DataSource) CreateAccount(ctx context.Context, a *rbac.Account) error
 		}
 		return err
 	}
-	log.Info("create new account: " + a.ID)
+	log.Info("succeed to create new account: " + a.ID)
 	return nil
 }
 
 func (ds *DataSource) AccountExist(ctx context.Context, name string) (bool, error) {
-	filter := bson.M{
-		model.ColumnAccountName: name,
-	}
+	filter := mutil.NewFilter(mutil.AccountName(name))
 	count, err := client.GetMongoClient().Count(ctx, model.CollectionAccount, filter)
 	if err != nil {
 		return false, err
@@ -74,28 +73,30 @@ func (ds *DataSource) AccountExist(ctx context.Context, name string) (bool, erro
 }
 
 func (ds *DataSource) GetAccount(ctx context.Context, name string) (*rbac.Account, error) {
-	filter := bson.M{
-		model.ColumnAccountName: name,
-	}
+	filter := mutil.NewFilter(mutil.AccountName(name))
 	result, err := client.GetMongoClient().FindOne(ctx, model.CollectionAccount, filter)
 	if err != nil {
+		msg := fmt.Sprintf("failed to query account, account name %s", name)
+		log.Error(msg, err)
 		return nil, err
 	}
 	if result.Err() != nil {
-		log.Error("failed to get account: ", result.Err())
-		return nil, errors.New("failed to get account")
+		msg := fmt.Sprintf("failed to query account, account name %s", name)
+		log.Error(msg, result.Err())
+		return nil, datasource.ErrQueryAccountFailed
 	}
 	var account rbac.Account
 	err = result.Decode(&account)
 	if err != nil {
-		log.Error("decode account failed: ", err)
+		log.Error("failed to decode account", err)
 		return nil, err
 	}
 	return &account, nil
 }
 
 func (ds *DataSource) ListAccount(ctx context.Context) ([]*rbac.Account, int64, error) {
-	cursor, err := client.GetMongoClient().Find(ctx, model.CollectionAccount, bson.M{})
+	filter := mutil.NewFilter()
+	cursor, err := client.GetMongoClient().Find(ctx, model.CollectionAccount, filter)
 	if err != nil {
 		return nil, 0, err
 	}
@@ -105,7 +106,7 @@ func (ds *DataSource) ListAccount(ctx context.Context) ([]*rbac.Account, int64,
 		var account rbac.Account
 		err = cursor.Decode(&account)
 		if err != nil {
-			log.Error("decode account failed: ", err)
+			log.Error("failed to decode account", err)
 			continue
 		}
 		account.Password = ""
@@ -118,9 +119,8 @@ func (ds *DataSource) DeleteAccount(ctx context.Context, names []string) (bool,
 	if len(names) == 0 {
 		return false, nil
 	}
-	filter := bson.M{
-		model.ColumnAccountName: names[0],
-	}
+	inFilter := mutil.NewFilter(mutil.In(names))
+	filter := mutil.NewFilter(mutil.AccountName(inFilter))
 	result, err := client.GetMongoClient().Delete(ctx, model.CollectionAccount, filter)
 	if err != nil {
 		return false, err
@@ -132,20 +132,16 @@ func (ds *DataSource) DeleteAccount(ctx context.Context, names []string) (bool,
 }
 
 func (ds *DataSource) UpdateAccount(ctx context.Context, name string, account *rbac.Account) error {
-	filter := bson.M{
-		model.ColumnAccountName: name,
-	}
-	update := bson.M{
-		"$set": bson.M{
-			model.ColumnID:                  account.ID,
-			model.ColumnPassword:            account.Password,
-			model.ColumnRoles:               account.Roles,
-			model.ColumnTokenExpirationTime: account.TokenExpirationTime,
-			model.ColumnCurrentPassword:     account.CurrentPassword,
-			model.ColumnStatus:              account.Status,
-		},
-	}
-	res, err := client.GetMongoClient().Update(ctx, model.CollectionAccount, filter, update)
+	filter := mutil.NewFilter(mutil.AccountName(name))
+	setFilter := mutil.NewFilter(
+		mutil.ID(account.ID),
+		mutil.Password(account.Password), mutil.Roles(account.Roles),
+		mutil.TokenExpirationTime(account.TokenExpirationTime),
+		mutil.CurrentPassword(account.CurrentPassword),
+		mutil.Status(account.Status),
+	)
+	updateFilter := mutil.NewFilter(mutil.Set(setFilter))
+	res, err := client.GetMongoClient().Update(ctx, model.CollectionAccount, filter, updateFilter)
 	if err != nil {
 		return err
 	}
diff --git a/datasource/mongo/client/common.go b/datasource/mongo/client/common.go
index 1fa44d5..dbc6f9c 100644
--- a/datasource/mongo/client/common.go
+++ b/datasource/mongo/client/common.go
@@ -23,4 +23,5 @@ var (
 	ErrCollectionsNil = errors.New("collection is nil")
 	ErrOpenDbFailed   = errors.New("open db failed")
 	ErrRootCAMissing  = errors.New("rootCAFile is empty in config file")
+	ErrNoDocuments    = errors.New("no doc found")
 )
diff --git a/datasource/mongo/client/dao/instance.go b/datasource/mongo/client/dao/instance.go
new file mode 100644
index 0000000..a59be3e
--- /dev/null
+++ b/datasource/mongo/client/dao/instance.go
@@ -0,0 +1,95 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package dao
+
+import (
+	"context"
+
+	"github.com/go-chassis/cari/discovery"
+	"go.mongodb.org/mongo-driver/mongo/options"
+
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+)
+
+func GetInstance(ctx context.Context, filter interface{}) (*model.Instance, error) {
+	findRes, err := client.GetMongoClient().FindOne(ctx, model.CollectionInstance, filter)
+	if err != nil {
+		return nil, err
+	}
+	var instance *model.Instance
+	if findRes.Err() != nil {
+		//not get any service,not db err
+		return nil, nil
+	}
+	err = findRes.Decode(&instance)
+	if err != nil {
+		return nil, err
+	}
+	return instance, nil
+}
+
+func GetInstances(ctx context.Context, filter interface{}) ([]*model.Instance, error) {
+	res, err := client.GetMongoClient().Find(ctx, model.CollectionInstance, filter)
+	if err != nil {
+		return nil, err
+	}
+	var instances []*model.Instance
+	for res.Next(ctx) {
+		var tmp *model.Instance
+		err := res.Decode(&tmp)
+		if err != nil {
+			return nil, err
+		}
+		instances = append(instances, tmp)
+	}
+	return instances, nil
+}
+
+func GetMicroServiceInstances(ctx context.Context, filter interface{}, opts ...*options.FindOptions) ([]*discovery.MicroServiceInstance, error) {
+	res, err := client.GetMongoClient().Find(ctx, model.CollectionInstance, filter, opts...)
+	if err != nil {
+		return nil, err
+	}
+	var instances []*discovery.MicroServiceInstance
+	for res.Next(ctx) {
+		var tmp model.Instance
+		err := res.Decode(&tmp)
+		if err != nil {
+			return nil, err
+		}
+		instances = append(instances, tmp.Instance)
+	}
+	return instances, nil
+}
+
+func CountInstance(ctx context.Context, filter interface{}) (int64, error) {
+	count, err := client.GetMongoClient().Count(ctx, model.CollectionInstance, filter)
+	if err != nil {
+		return 0, err
+	}
+	return count, nil
+}
+
+func UpdateInstance(ctx context.Context, filter interface{}, update interface{}, opts ...*options.UpdateOptions) *discovery.Error {
+	_, err := client.GetMongoClient().Update(ctx, model.CollectionInstance, filter, update, opts...)
+	if err != nil {
+		return discovery.NewError(discovery.ErrUnavailableBackend, err.Error())
+	}
+	return nil
+}
diff --git a/datasource/mongo/client/dao/microservice.go b/datasource/mongo/client/dao/microservice.go
new file mode 100644
index 0000000..51b1c58
--- /dev/null
+++ b/datasource/mongo/client/dao/microservice.go
@@ -0,0 +1,108 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package dao
+
+import (
+	"context"
+	"github.com/go-chassis/cari/discovery"
+	"go.mongodb.org/mongo-driver/mongo/options"
+
+	"github.com/apache/servicecomb-service-center/datasource"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+)
+
+func GetService(ctx context.Context, filter interface{}, opts ...*options.FindOneOptions) (*model.Service, error) {
+	result, err := client.GetMongoClient().FindOne(ctx, model.CollectionService, filter, opts...)
+	if err != nil {
+		return nil, err
+	}
+	var svc *model.Service
+	if result.Err() != nil {
+		//not get any service,not db err
+		return nil, datasource.ErrNoData
+	}
+	err = result.Decode(&svc)
+	if err != nil {
+		return nil, err
+	}
+	return svc, nil
+}
+
+func GetServices(ctx context.Context, filter interface{}, opts ...*options.FindOptions) ([]*model.Service, error) {
+	res, err := client.GetMongoClient().Find(ctx, model.CollectionService, filter, opts...)
+	if err != nil {
+		return nil, err
+	}
+	var services []*model.Service
+	for res.Next(ctx) {
+		var tmp *model.Service
+		err := res.Decode(&tmp)
+		if err != nil {
+			return nil, err
+		}
+		services = append(services, tmp)
+	}
+	return services, nil
+}
+
+func GetMicroServices(ctx context.Context, filter interface{}, opts ...*options.FindOptions) ([]*discovery.MicroService, error) {
+	res, err := client.GetMongoClient().Find(ctx, model.CollectionService, filter, opts...)
+	if err != nil {
+		return nil, err
+	}
+	var services []*discovery.MicroService
+	for res.Next(ctx) {
+		var tmp model.Service
+		err := res.Decode(&tmp)
+		if err != nil {
+			return nil, err
+		}
+		services = append(services, tmp.Service)
+	}
+	return services, nil
+}
+
+func UpdateService(ctx context.Context, filter interface{}, update interface{}, opts ...*options.FindOneAndUpdateOptions) error {
+	res, err := client.GetMongoClient().FindOneAndUpdate(ctx, model.CollectionService, filter, update, opts...)
+	if err != nil {
+		return err
+	}
+	if res.Err() != nil {
+		// means no doc find, if the operation is update,should return err
+		return client.ErrNoDocuments
+	}
+	return nil
+}
+
+func GetServicesVersions(ctx context.Context, filter interface{}) ([]string, error) {
+	res, err := client.GetMongoClient().Find(ctx, model.CollectionService, filter)
+	if err != nil {
+		return nil, nil
+	}
+	var versions []string
+	for res.Next(ctx) {
+		var tmp model.Service
+		err := res.Decode(&tmp)
+		if err != nil {
+			return nil, err
+		}
+		versions = append(versions, tmp.Service.Version)
+	}
+	return versions, nil
+}
diff --git a/datasource/mongo/client/dao/rule.go b/datasource/mongo/client/dao/rule.go
new file mode 100644
index 0000000..522a119
--- /dev/null
+++ b/datasource/mongo/client/dao/rule.go
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package dao
+
+import (
+	"context"
+
+	"github.com/go-chassis/cari/discovery"
+	"go.mongodb.org/mongo-driver/bson"
+	"go.mongodb.org/mongo-driver/mongo/options"
+
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	"github.com/apache/servicecomb-service-center/pkg/log"
+)
+
+func GetRules(ctx context.Context, filter interface{}) ([]*model.Rule, error) {
+	cursor, err := client.GetMongoClient().Find(ctx, model.CollectionRule, filter)
+	if err != nil {
+		return nil, err
+	}
+	if cursor.Err() != nil {
+		return nil, cursor.Err()
+	}
+	var rules []*model.Rule
+	defer cursor.Close(ctx)
+	for cursor.Next(ctx) {
+		var rule model.Rule
+		err := cursor.Decode(&rule)
+		if err != nil {
+			log.Error("type conversion error", err)
+			return nil, err
+		}
+		rules = append(rules, &rule)
+	}
+	return rules, nil
+}
+
+func GetServiceRules(ctx context.Context, filter interface{}, opts ...*options.FindOptions) ([]*discovery.ServiceRule, error) {
+	ruleRes, err := client.GetMongoClient().Find(ctx, model.CollectionRule, filter, opts...)
+	if err != nil {
+		return nil, err
+	}
+	var rules []*discovery.ServiceRule
+	for ruleRes.Next(ctx) {
+		var tempRule *model.Rule
+		err := ruleRes.Decode(&tempRule)
+		if err != nil {
+			return nil, err
+		}
+		rules = append(rules, tempRule.Rule)
+	}
+	return rules, nil
+}
+
+func RuleExist(ctx context.Context, filter interface{}) (bool, error) {
+	return client.GetMongoClient().DocExist(ctx, model.CollectionRule, filter)
+}
+
+func UpdateRule(ctx context.Context, filter interface{}, m bson.M) error {
+	return client.GetMongoClient().DocUpdate(ctx, model.CollectionRule, filter, m)
+}
+
+func UpdateSchema(ctx context.Context, filter interface{}, update interface{}, opts ...*options.FindOneAndUpdateOptions) error {
+	_, err := client.GetMongoClient().FindOneAndUpdate(ctx, model.CollectionSchema, filter, update, opts...)
+	if err != nil {
+		return err
+	}
+	return nil
+}
diff --git a/datasource/mongo/client/dao/schema.go b/datasource/mongo/client/dao/schema.go
new file mode 100644
index 0000000..fbf6d28
--- /dev/null
+++ b/datasource/mongo/client/dao/schema.go
@@ -0,0 +1,81 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package dao
+
+import (
+	"context"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
+	"github.com/go-chassis/cari/discovery"
+)
+
+func GetSchema(ctx context.Context, filter interface{}) (*model.Schema, error) {
+	findRes, err := client.GetMongoClient().FindOne(ctx, model.CollectionSchema, filter)
+	if err != nil {
+		return nil, err
+	}
+	if findRes.Err() != nil {
+		//not get any service,not db err
+		return nil, nil
+	}
+	var schema *model.Schema
+	err = findRes.Decode(&schema)
+	if err != nil {
+		return nil, err
+	}
+	return schema, nil
+}
+
+func GetSchemas(ctx context.Context, filter interface{}) ([]*discovery.Schema, error) {
+	getRes, err := client.GetMongoClient().Find(ctx, model.CollectionSchema, filter)
+	if err != nil {
+		return nil, err
+	}
+	var schemas []*discovery.Schema
+	for getRes.Next(ctx) {
+		var tmp *model.Schema
+		err = getRes.Decode(&tmp)
+		if err != nil {
+			return nil, err
+		}
+		schemas = append(schemas, &discovery.Schema{
+			SchemaId: tmp.SchemaID,
+			Summary:  tmp.SchemaSummary,
+			Schema:   tmp.Schema,
+		})
+	}
+	return schemas, nil
+}
+
+func SchemaSummaryExist(ctx context.Context, serviceID, schemaID string) (bool, error) {
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceID(serviceID), mutil.SchemaID(schemaID))
+	res, err := client.GetMongoClient().FindOne(ctx, model.CollectionSchema, filter)
+	if err != nil {
+		return false, err
+	}
+	if res.Err() != nil {
+		return false, nil
+	}
+	var s model.Schema
+	err = res.Decode(&s)
+	if err != nil {
+		return false, err
+	}
+	return len(s.SchemaSummary) != 0, nil
+}
diff --git a/datasource/mongo/heartbeat/checker/heartbeat.go b/datasource/mongo/client/dao/tag.go
similarity index 59%
copy from datasource/mongo/heartbeat/checker/heartbeat.go
copy to datasource/mongo/client/dao/tag.go
index a5fb039..36ce4dc 100644
--- a/datasource/mongo/heartbeat/checker/heartbeat.go
+++ b/datasource/mongo/client/dao/tag.go
@@ -15,35 +15,29 @@
  * limitations under the License.
  */
 
-package checker
+package dao
 
 import (
 	"context"
-	"time"
 
-	"go.mongodb.org/mongo-driver/bson"
-
-	"github.com/apache/servicecomb-service-center/datasource/mongo"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/pkg/log"
 )
 
-func updateInstanceRefreshTime(ctx context.Context, serviceID string, instanceID string) error {
-	filter := bson.M{
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  serviceID,
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instanceID,
-	}
-	update := bson.M{
-		"$set": bson.M{model.ColumnRefreshTime: time.Now()},
-	}
-	result, err := client.GetMongoClient().FindOneAndUpdate(ctx, model.CollectionInstance, filter, update)
+func GetTags(ctx context.Context, filter interface{}) (tags map[string]string, err error) {
+	result, err := client.GetMongoClient().FindOne(ctx, model.CollectionService, filter)
 	if err != nil {
-		log.Error("failed to update refresh time of instance: ", err)
-		return err
+		return nil, err
 	}
 	if result.Err() != nil {
-		return result.Err()
+		return nil, result.Err()
+	}
+	var service model.Service
+	err = result.Decode(&service)
+	if err != nil {
+		log.Error("type conversion error", err)
+		return nil, err
 	}
-	return nil
+	return service.Tags, nil
 }
diff --git a/datasource/mongo/client/errortypes.go b/datasource/mongo/client/errortypes.go
index 423401b..759315f 100644
--- a/datasource/mongo/client/errortypes.go
+++ b/datasource/mongo/client/errortypes.go
@@ -16,15 +16,9 @@
 package client
 
 import (
-	"errors"
-
 	"go.mongodb.org/mongo-driver/mongo"
 )
 
-var (
-	ErrNoDocuments = errors.New("no doc found")
-)
-
 const (
 	DuplicateKey      = 11000
 	CollectionsExists = 48
diff --git a/datasource/mongo/model/types.go b/datasource/mongo/client/model/types.go
similarity index 100%
rename from datasource/mongo/model/types.go
rename to datasource/mongo/client/model/types.go
diff --git a/datasource/mongo/dep.go b/datasource/mongo/dep.go
index ea83355..18af64f 100644
--- a/datasource/mongo/dep.go
+++ b/datasource/mongo/dep.go
@@ -29,7 +29,8 @@ import (
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/etcd/path"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/log"
 	"github.com/apache/servicecomb-service-center/pkg/util"
@@ -38,8 +39,8 @@ import (
 func (ds *DataSource) SearchProviderDependency(ctx context.Context, request *discovery.GetDependenciesRequest) (*discovery.GetProDependenciesResponse, error) {
 	domainProject := util.ParseDomainProject(ctx)
 	providerServiceID := request.ServiceId
-	filter := GeneratorServiceFilter(ctx, providerServiceID)
-	provider, err := GetService(ctx, filter)
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(providerServiceID))
+	provider, err := dao.GetService(ctx, filter)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("query provider service failed, there is no provider %s in db", providerServiceID))
@@ -76,9 +77,8 @@ func (ds *DataSource) SearchProviderDependency(ctx context.Context, request *dis
 func (ds *DataSource) SearchConsumerDependency(ctx context.Context, request *discovery.GetDependenciesRequest) (*discovery.GetConDependenciesResponse, error) {
 	domainProject := util.ParseDomainProject(ctx)
 	consumerID := request.ServiceId
-
-	filter := GeneratorServiceFilter(ctx, consumerID)
-	consumer, err := GetService(ctx, filter)
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(consumerID))
+	consumer, err := dao.GetService(ctx, filter)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("query consumer service failed, there is no consumer %s in db", consumerID))
@@ -226,7 +226,7 @@ func updateDeps(domainProject string, dep *datasource.Dependency) error {
 	var upsert = true
 	for _, r := range dep.DeleteDependencyRuleList {
 		filter := GenerateProviderDependencyRuleKey(domainProject, r)
-		_, err := client.GetMongoClient().Update(context.TODO(), model.CollectionDep, filter, bson.M{"$pull": bson.M{StringBuilder([]string{model.ColumnDep, model.ColumnDependency}): dep.Consumer}})
+		_, err := client.GetMongoClient().Update(context.TODO(), model.CollectionDep, filter, bson.M{"$pull": bson.M{mutil.ConnectWithDot([]string{model.ColumnDep, model.ColumnDependency}): dep.Consumer}})
 		if err != nil {
 			return err
 		}
@@ -237,7 +237,7 @@ func updateDeps(domainProject string, dep *datasource.Dependency) error {
 	for _, r := range dep.CreateDependencyRuleList {
 		filter := GenerateProviderDependencyRuleKey(domainProject, r)
 		data := bson.M{
-			"$addToSet": bson.M{StringBuilder([]string{model.ColumnDep, model.ColumnDependency}): dep.Consumer},
+			"$addToSet": bson.M{mutil.ConnectWithDot([]string{model.ColumnDep, model.ColumnDependency}): dep.Consumer},
 		}
 		_, err := client.GetMongoClient().Update(context.TODO(), model.CollectionDep, filter, data, &options.UpdateOptions{Upsert: &upsert})
 		if err != nil {
@@ -255,7 +255,7 @@ func updateDeps(domainProject string, dep *datasource.Dependency) error {
 		}
 	} else {
 		updateData := bson.M{
-			"$set": bson.M{StringBuilder([]string{model.ColumnDep, model.ColumnDependency}): dep.ProvidersRule},
+			"$set": bson.M{mutil.ConnectWithDot([]string{model.ColumnDep, model.ColumnDependency}): dep.ProvidersRule},
 		}
 		_, err := client.GetMongoClient().Update(context.TODO(), model.CollectionDep, filter, updateData, &options.UpdateOptions{Upsert: &upsert})
 		if err != nil {
@@ -401,7 +401,7 @@ func removeConsumerDeps(ctx context.Context, depRule *model.DependencyRule, cach
 		_, err = client.GetMongoClient().DocDelete(ctx, model.CollectionDep, filter)
 	} else {
 		updateData := bson.M{
-			"$set": bson.M{StringBuilder([]string{model.ColumnDep, model.ColumnDependency}): left},
+			"$set": bson.M{mutil.ConnectWithDot([]string{model.ColumnDep, model.ColumnDependency}): left},
 		}
 		_, err = client.GetMongoClient().Update(ctx, model.CollectionDep, filter, updateData)
 	}
@@ -451,18 +451,32 @@ func GetConsumerDepInfo(ctx context.Context, filter bson.M) ([]*discovery.Consum
 }
 
 func GetServiceID(ctx context.Context, key *discovery.MicroServiceKey) (string, error) {
-	id, err := getServiceID(ctx, GeneratorServiceNameFilter(ctx, key))
+	filter := mutil.NewBasicFilter(
+		ctx,
+		mutil.ServiceEnv(key.Environment),
+		mutil.ServiceAppID(key.AppId),
+		mutil.ServiceServiceName(key.ServiceName),
+		mutil.ServiceVersion(key.Version),
+	)
+	id, err := getServiceID(ctx, filter)
 	if err != nil && !errors.Is(err, datasource.ErrNoData) {
 		return "", err
 	}
 	if len(id) == 0 && len(key.Alias) != 0 {
-		return getServiceID(ctx, GeneratorServiceAliasFilter(ctx, key))
+		filter = mutil.NewBasicFilter(
+			ctx,
+			mutil.ServiceEnv(key.Environment),
+			mutil.ServiceAppID(key.AppId),
+			mutil.ServiceAlias(key.Alias),
+			mutil.ServiceVersion(key.Version),
+		)
+		return getServiceID(ctx, filter)
 	}
 	return id, nil
 }
 
 func getServiceID(ctx context.Context, filter bson.M) (serviceID string, err error) {
-	svc, err := GetService(ctx, filter)
+	svc, err := dao.GetService(ctx, filter)
 	if err != nil {
 		return
 	}
diff --git a/datasource/mongo/dep_util.go b/datasource/mongo/dep_util.go
index d50ca89..6a39b4e 100644
--- a/datasource/mongo/dep_util.go
+++ b/datasource/mongo/dep_util.go
@@ -23,7 +23,9 @@ import (
 
 	pb "github.com/go-chassis/cari/discovery"
 
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/log"
 	"github.com/apache/servicecomb-service-center/pkg/util"
 )
@@ -36,7 +38,8 @@ func GetAllConsumerIds(ctx context.Context, provider *pb.MicroService) (allow []
 	//todo 删除服务,最后实例推送有误差
 	domain := util.ParseDomainProject(ctx)
 	project := util.ParseProject(ctx)
-	providerRules, err := getRulesUtil(ctx, domain, project, provider.ServiceId)
+	filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(provider.ServiceId))
+	providerRules, err := dao.GetRules(ctx, filter)
 	if err != nil {
 		return nil, nil, err
 	}
diff --git a/datasource/mongo/dependency_query.go b/datasource/mongo/dependency_query.go
index cc482ea..f307680 100644
--- a/datasource/mongo/dependency_query.go
+++ b/datasource/mongo/dependency_query.go
@@ -30,7 +30,8 @@ import (
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/etcd/path"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/log"
 	"github.com/apache/servicecomb-service-center/pkg/validate"
@@ -90,8 +91,8 @@ func (dr *DependencyRelation) GetDependencyProviders(opts ...DependencyRelationF
 		}
 
 		for _, providerID := range providerIDs {
-			filter := GeneratorServiceFilter(dr.ctx, providerID)
-			provider, err := GetService(dr.ctx, filter)
+			filter := util.NewBasicFilter(dr.ctx, util.ServiceServiceID(providerID))
+			provider, err := dao.GetService(dr.ctx, filter)
 			if err != nil {
 				if errors.Is(err, datasource.ErrNoData) {
 					log.Warn(fmt.Sprintf("provider[%s/%s/%s/%s] does not exist",
@@ -365,13 +366,13 @@ func MicroServiceKeyFilter(key *pb.MicroServiceKey) (bson.M, error) {
 	if len(tenant) != 2 {
 		return nil, util.ErrInvalidDomainProject
 	}
-	return bson.M{
-		model.ColumnDomain:  tenant[0],
-		model.ColumnProject: tenant[1],
-		StringBuilder([]string{model.ColumnService, model.ColumnEnv}):     key.Environment,
-		StringBuilder([]string{model.ColumnService, model.ColumnAppID}):   key.AppId,
-		StringBuilder([]string{model.ColumnService, model.ColumnAlias}):   key.Alias,
-		StringBuilder([]string{model.ColumnService, model.ColumnVersion}): key.Version}, nil
+	filter := util.NewDomainProjectFilter(tenant[0], tenant[1],
+		util.ServiceEnv(key.Environment),
+		util.ServiceAppID(key.AppId),
+		util.ServiceAlias(key.Alias),
+		util.ServiceVersion(key.Version),
+	)
+	return filter, nil
 }
 
 func RelyAllServiceKey(key *pb.MicroServiceKey) (bson.M, error) {
@@ -379,10 +380,8 @@ func RelyAllServiceKey(key *pb.MicroServiceKey) (bson.M, error) {
 	if len(tenant) != 2 {
 		return nil, util.ErrInvalidDomainProject
 	}
-	return bson.M{
-		model.ColumnDomain:  tenant[0],
-		model.ColumnProject: tenant[1],
-		StringBuilder([]string{model.ColumnService, model.ColumnEnv}): key.Environment}, nil
+	filter := util.NewDomainProjectFilter(tenant[0], tenant[1], util.ServiceEnv(key.Environment))
+	return filter, nil
 }
 
 func FindServiceIds(ctx context.Context, versionRule string, key *pb.MicroServiceKey) ([]string, bool, error) {
@@ -398,8 +397,8 @@ func FindServiceIds(ctx context.Context, versionRule string, key *pb.MicroServic
 	baseFilter := bson.D{
 		{Key: model.ColumnDomain, Value: tenant[0]},
 		{Key: model.ColumnProject, Value: tenant[1]},
-		{Key: StringBuilder([]string{model.ColumnService, model.ColumnEnv}), Value: key.Environment},
-		{Key: StringBuilder([]string{model.ColumnService, model.ColumnAppID}), Value: key.AppId}}
+		{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnEnv}), Value: key.Environment},
+		{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnAppID}), Value: key.AppId}}
 
 	serviceIds, exist, err := findServiceKeysByServiceName(ctx, versionRule, key, baseFilter)
 	if err != nil {
@@ -446,13 +445,13 @@ func serviceVersionFilter(ctx context.Context, versionRule string, filter bson.D
 
 func findServiceKeysByServiceName(ctx context.Context, versionRule string, key *pb.MicroServiceKey, baseFilter bson.D) ([]string, bool, error) {
 	filter := append(baseFilter,
-		bson.E{Key: StringBuilder([]string{model.ColumnService, model.ColumnServiceName}), Value: key.ServiceName})
+		bson.E{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnServiceName}), Value: key.ServiceName})
 	return serviceVersionFilter(ctx, versionRule, filter)
 }
 
 func findServiceKeysByAlias(ctx context.Context, versionRule string, key *pb.MicroServiceKey, baseFilter bson.D) ([]string, bool, error) {
 	filter := append(baseFilter,
-		bson.E{Key: StringBuilder([]string{model.ColumnService, model.ColumnAlias}), Value: key.Alias})
+		bson.E{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnAlias}), Value: key.Alias})
 	return serviceVersionFilter(ctx, versionRule, filter)
 }
 
@@ -465,15 +464,15 @@ func findServiceKeys(ctx context.Context, versionRule string, filter bson.D) (fi
 		return GetVersionServiceLatest, filter
 	case versionRule[len(versionRule)-1:] == "+":
 		start := versionRule[:len(versionRule)-1]
-		filter = append(filter, bson.E{Key: StringBuilder([]string{model.ColumnService, model.ColumnVersion}), Value: bson.M{"$gte": start}})
+		filter = append(filter, bson.E{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}), Value: bson.M{"$gte": start}})
 		return GetVersionService, filter
 	case rangeIdx > 0:
 		start := versionRule[:rangeIdx]
 		end := versionRule[rangeIdx+1:]
-		filter = append(filter, bson.E{Key: StringBuilder([]string{model.ColumnService, model.ColumnVersion}), Value: bson.M{"$gte": start, "$lt": end}})
+		filter = append(filter, bson.E{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}), Value: bson.M{"$gte": start, "$lt": end}})
 		return GetVersionService, filter
 	default:
-		filter = append(filter, bson.E{Key: StringBuilder([]string{model.ColumnService, model.ColumnVersion}), Value: versionRule})
+		filter = append(filter, bson.E{Key: util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}), Value: versionRule})
 		return nil, filter
 	}
 }
@@ -481,7 +480,7 @@ func findServiceKeys(ctx context.Context, versionRule string, filter bson.D) (fi
 func GetVersionServiceLatest(ctx context.Context, m bson.D) (serviceIds []string, err error) {
 	findRes, err := client.GetMongoClient().Find(ctx, model.CollectionService, m,
 		&options.FindOptions{
-			Sort: bson.M{StringBuilder([]string{model.ColumnService, model.ColumnVersion}): -1}})
+			Sort: bson.M{util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}): -1}})
 	if err != nil {
 		return nil, err
 	}
@@ -504,7 +503,7 @@ func GetVersionServiceLatest(ctx context.Context, m bson.D) (serviceIds []string
 
 func GetVersionService(ctx context.Context, m bson.D) (serviceIds []string, err error) {
 	findRes, err := client.GetMongoClient().Find(ctx, model.CollectionService, m, &options.FindOptions{
-		Sort: bson.M{StringBuilder([]string{model.ColumnService, model.ColumnVersion}): -1}})
+		Sort: bson.M{util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}): -1}})
 	if err != nil {
 		return
 	}
@@ -534,24 +533,16 @@ func ParseVersionRule(ctx context.Context, versionRule string, key *pb.MicroServ
 	rangeIdx := strings.Index(versionRule, "-")
 	switch {
 	case versionRule == "latest":
-		filter := bson.M{
-			model.ColumnDomain:  tenant[0],
-			model.ColumnProject: tenant[1]}
+		filter := util.NewDomainProjectFilter(tenant[0], tenant[1])
 		return GetFilterVersionServiceLatest(ctx, filter)
 	case versionRule[len(versionRule)-1:] == "+":
 		start := versionRule[:len(versionRule)-1]
-		filter := bson.M{
-			model.ColumnDomain:  tenant[0],
-			model.ColumnProject: tenant[1],
-			StringBuilder([]string{model.ColumnService, model.ColumnVersion}): bson.M{"$gte": start}}
+		filter := util.NewDomainProjectFilter(tenant[0], tenant[1], util.ServiceVersion(bson.M{"$gte": start}))
 		return GetFilterVersionService(ctx, filter)
 	case rangeIdx > 0:
 		start := versionRule[:rangeIdx]
 		end := versionRule[rangeIdx+1:]
-		filter := bson.M{
-			model.ColumnDomain:  tenant[0],
-			model.ColumnProject: tenant[1],
-			StringBuilder([]string{model.ColumnService, model.ColumnVersion}): bson.M{"$gte": start, "$lte": end}}
+		filter := util.NewDomainProjectFilter(tenant[0], tenant[1], util.ServiceVersion(bson.M{"$gte": start, "$lte": end}))
 		return GetFilterVersionService(ctx, filter)
 	default:
 		return nil, nil
@@ -580,7 +571,7 @@ func GetFilterVersionService(ctx context.Context, m bson.M) (serviceIDs []string
 func GetFilterVersionServiceLatest(ctx context.Context, m bson.M) (serviceIDs []string, err error) {
 	findRes, err := client.GetMongoClient().Find(ctx, model.CollectionService, m,
 		&options.FindOptions{
-			Sort: bson.M{StringBuilder([]string{model.ColumnService, model.ColumnVersion}): -1}})
+			Sort: bson.M{util.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}): -1}})
 	if err != nil {
 		return nil, err
 	}
@@ -640,31 +631,35 @@ func GenerateProviderDependencyRuleKey(domainProject string, in *pb.MicroService
 }
 
 func GenerateRuleKeyWithSameServiceNameAndAppID(serviceType string, domainProject string, in *pb.MicroServiceKey) bson.M {
-	return bson.M{
-		model.ColumnServiceType: serviceType,
-		StringBuilder([]string{model.ColumnServiceKey, model.ColumnTenant}):      domainProject,
-		StringBuilder([]string{model.ColumnServiceKey, model.ColumnAppID}):       in.AppId,
-		StringBuilder([]string{model.ColumnServiceKey, model.ColumnServiceName}): in.ServiceName}
+	return util.NewFilter(
+		util.ServiceType(serviceType),
+		util.ServiceKeyTenant(domainProject),
+		util.ServiceKeyAppID(in.AppId),
+		util.ServiceServiceName(in.ServiceName),
+	)
 }
 
 func GenerateServiceDependencyRuleKey(serviceType string, domainProject string, in *pb.MicroServiceKey) bson.M {
 	if in == nil {
-		return bson.M{
-			model.ColumnServiceType: serviceType,
-			StringBuilder([]string{model.ColumnServiceKey, model.ColumnTenant}): domainProject}
+		return util.NewFilter(
+			util.ServiceType(serviceType),
+			util.ServiceKeyTenant(domainProject),
+		)
 	}
 	if in.ServiceName == "*" {
-		return bson.M{
-			model.ColumnServiceType: serviceType,
-			StringBuilder([]string{model.ColumnServiceKey, model.ColumnTenant}):      domainProject,
-			StringBuilder([]string{model.ColumnServiceKey, model.ColumnEnv}):         in.Environment,
-			StringBuilder([]string{model.ColumnServiceKey, model.ColumnServiceName}): in.ServiceName}
-	}
-	return bson.M{
-		model.ColumnServiceType: serviceType,
-		StringBuilder([]string{model.ColumnServiceKey, model.ColumnTenant}):      domainProject,
-		StringBuilder([]string{model.ColumnServiceKey, model.ColumnEnv}):         in.Environment,
-		StringBuilder([]string{model.ColumnServiceKey, model.ColumnAppID}):       in.AppId,
-		StringBuilder([]string{model.ColumnServiceKey, model.ColumnVersion}):     in.Version,
-		StringBuilder([]string{model.ColumnServiceKey, model.ColumnServiceName}): in.ServiceName}
+		return util.NewFilter(
+			util.ServiceType(serviceType),
+			util.ServiceKeyTenant(domainProject),
+			util.ServiceKeyServiceEnv(in.Environment),
+			util.ServiceKeyServiceName(in.ServiceName),
+		)
+	}
+	return util.NewFilter(
+		util.ServiceType(serviceType),
+		util.ServiceKeyTenant(domainProject),
+		util.ServiceKeyServiceEnv(in.Environment),
+		util.ServiceKeyAppID(in.AppId),
+		util.ServiceKeyServiceVersion(in.Version),
+		util.ServiceServiceName(in.ServiceName),
+	)
 }
diff --git a/datasource/mongo/engine.go b/datasource/mongo/engine.go
index 96dfe2b..7346733 100644
--- a/datasource/mongo/engine.go
+++ b/datasource/mongo/engine.go
@@ -25,12 +25,11 @@ import (
 	"time"
 
 	pb "github.com/go-chassis/cari/discovery"
-	"go.mongodb.org/mongo-driver/bson"
 
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/etcd/path"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/cluster"
 	"github.com/apache/servicecomb-service-center/pkg/gopool"
@@ -235,10 +234,7 @@ func (ds *DataSource) autoSelfHeartBeat() {
 }
 
 func GetAllServicesAcrossDomainProject(ctx context.Context) (map[string][]*pb.MicroService, error) {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-
-	filter := bson.M{"domain": domain, "project": project}
+	filter := mutil.NewBasicFilter(ctx)
 
 	findRes, err := client.GetMongoClient().Find(ctx, model.CollectionService, filter)
 	if err != nil {
diff --git a/datasource/mongo/event/instance_event_handler.go b/datasource/mongo/event/instance_event_handler.go
index a2804ab..9dbe5bc 100644
--- a/datasource/mongo/event/instance_event_handler.go
+++ b/datasource/mongo/event/instance_event_handler.go
@@ -28,7 +28,8 @@ import (
 
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/sd"
 	"github.com/apache/servicecomb-service-center/pkg/dump"
 	"github.com/apache/servicecomb-service-center/pkg/log"
@@ -60,7 +61,7 @@ func (h InstanceEventHandler) OnEvent(evt sd.MongoEvent) {
 	}
 	if microService == nil {
 		log.Info("get cached service failed, then get from database")
-		service, err := mongo.GetService(context.Background(), bson.M{"serviceinfo.serviceid": providerID})
+		service, err := dao.GetService(context.Background(), bson.M{"serviceinfo.serviceid": providerID})
 		if err != nil {
 			if errors.Is(err, datasource.ErrNoData) {
 				log.Warn(fmt.Sprintf("there is no service with id [%s] in the database", providerID))
diff --git a/datasource/mongo/event/instance_event_handler_test.go b/datasource/mongo/event/instance_event_handler_test.go
index 1813f01..a080e18 100644
--- a/datasource/mongo/event/instance_event_handler_test.go
+++ b/datasource/mongo/event/instance_event_handler_test.go
@@ -29,7 +29,7 @@ import (
 	"github.com/stretchr/testify/assert"
 
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/sd"
 	"github.com/apache/servicecomb-service-center/server/syncernotify"
 
diff --git a/datasource/mongo/heartbeat/cache/heartbeat.go b/datasource/mongo/heartbeat/cache/heartbeat.go
index 506fd55..61e9b53 100644
--- a/datasource/mongo/heartbeat/cache/heartbeat.go
+++ b/datasource/mongo/heartbeat/cache/heartbeat.go
@@ -27,9 +27,9 @@ import (
 	"github.com/patrickmn/go-cache"
 	"go.mongodb.org/mongo-driver/bson"
 
-	"github.com/apache/servicecomb-service-center/datasource/mongo"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/gopool"
 	"github.com/apache/servicecomb-service-center/pkg/log"
 	"github.com/apache/servicecomb-service-center/server/config"
@@ -130,11 +130,7 @@ func cleanInstance(ctx context.Context, serviceID string, instanceID string) err
 	}
 	defer session.EndSession(ctx)
 
-	filter := bson.M{
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  serviceID,
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instanceID,
-	}
-
+	filter := util.NewFilter(util.InstanceServiceID(serviceID), util.InstanceInstanceID(instanceID))
 	result, err := client.GetMongoClient().FindOne(ctx, model.CollectionInstance, filter)
 	if err != nil {
 		log.Error("failed to query instance: %v", err)
@@ -167,10 +163,7 @@ func cleanInstance(ctx context.Context, serviceID string, instanceID string) err
 }
 
 func removeDBInstance(ctx context.Context, serviceID string, instanceID string) error {
-	filter := bson.M{
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  serviceID,
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instanceID,
-	}
+	filter := util.NewFilter(util.InstanceServiceID(serviceID), util.InstanceInstanceID(instanceID))
 	res, err := client.GetMongoClient().DeleteOne(ctx, model.CollectionInstance, filter)
 	if err != nil {
 		log.Error("failed to clean instance", err)
@@ -181,10 +174,7 @@ func removeDBInstance(ctx context.Context, serviceID string, instanceID string)
 }
 
 func findInstance(ctx context.Context, serviceID string, instanceID string) (*model.Instance, error) {
-	filter := bson.M{
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  serviceID,
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instanceID,
-	}
+	filter := util.NewFilter(util.InstanceServiceID(serviceID), util.InstanceInstanceID(instanceID))
 	result, err := client.GetMongoClient().FindOne(ctx, model.CollectionInstance, filter)
 	if err != nil {
 		return nil, err
@@ -199,10 +189,7 @@ func findInstance(ctx context.Context, serviceID string, instanceID string) (*mo
 }
 
 func updateInstance(ctx context.Context, serviceID string, instanceID string) error {
-	filter := bson.M{
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  serviceID,
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instanceID,
-	}
+	filter := util.NewFilter(util.InstanceServiceID(serviceID), util.InstanceInstanceID(instanceID))
 	update := bson.M{
 		"$set": bson.M{model.ColumnRefreshTime: time.Now()},
 	}
diff --git a/datasource/mongo/heartbeat/cache/heartbeat_test.go b/datasource/mongo/heartbeat/cache/heartbeat_test.go
index 91c503b..d6845e6 100644
--- a/datasource/mongo/heartbeat/cache/heartbeat_test.go
+++ b/datasource/mongo/heartbeat/cache/heartbeat_test.go
@@ -32,7 +32,7 @@ import (
 	"github.com/stretchr/testify/assert"
 
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 )
 
 func init() {
diff --git a/datasource/mongo/heartbeat/cache/heartbeatcache_test.go b/datasource/mongo/heartbeat/cache/heartbeatcache_test.go
index 835dd2f..028eb66 100644
--- a/datasource/mongo/heartbeat/cache/heartbeatcache_test.go
+++ b/datasource/mongo/heartbeat/cache/heartbeatcache_test.go
@@ -26,9 +26,9 @@ import (
 	"github.com/stretchr/testify/assert"
 	"go.mongodb.org/mongo-driver/bson"
 
-	"github.com/apache/servicecomb-service-center/datasource/mongo"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/util"
 )
 
 func TestHeartBeatCheck(t *testing.T) {
@@ -68,7 +68,7 @@ func TestHeartBeatCheck(t *testing.T) {
 			},
 		}
 		filter := bson.M{
-			mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instanceDB.Instance.InstanceId,
+			util.ConnectWithDot([]string{model.ColumnInstance, model.ColumnInstanceID}): instanceDB.Instance.InstanceId,
 		}
 		_, _ = client.GetMongoClient().Delete(context.Background(), model.CollectionInstance, filter)
 		_, err := client.GetMongoClient().Insert(context.Background(), model.CollectionInstance, instanceDB)
diff --git a/datasource/mongo/heartbeat/checker/heartbeat.go b/datasource/mongo/heartbeat/checker/heartbeat.go
index a5fb039..1bb3998 100644
--- a/datasource/mongo/heartbeat/checker/heartbeat.go
+++ b/datasource/mongo/heartbeat/checker/heartbeat.go
@@ -23,17 +23,14 @@ import (
 
 	"go.mongodb.org/mongo-driver/bson"
 
-	"github.com/apache/servicecomb-service-center/datasource/mongo"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/log"
 )
 
 func updateInstanceRefreshTime(ctx context.Context, serviceID string, instanceID string) error {
-	filter := bson.M{
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  serviceID,
-		mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instanceID,
-	}
+	filter := util.NewFilter(util.InstanceServiceID(serviceID), util.InstanceInstanceID(instanceID))
 	update := bson.M{
 		"$set": bson.M{model.ColumnRefreshTime: time.Now()},
 	}
diff --git a/datasource/mongo/heartbeat/checker/heartbeat_test.go b/datasource/mongo/heartbeat/checker/heartbeat_test.go
index c97ab27..520e5bb 100644
--- a/datasource/mongo/heartbeat/checker/heartbeat_test.go
+++ b/datasource/mongo/heartbeat/checker/heartbeat_test.go
@@ -25,15 +25,13 @@ import (
 	_ "github.com/apache/servicecomb-service-center/server/init"
 	_ "github.com/apache/servicecomb-service-center/server/plugin/security/cipher/buildin"
 
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/util"
+	"github.com/apache/servicecomb-service-center/pkg/log"
 	pb "github.com/go-chassis/cari/discovery"
 	"github.com/go-chassis/go-chassis/v2/storage"
 	"github.com/stretchr/testify/assert"
-	"go.mongodb.org/mongo-driver/bson"
-
-	"github.com/apache/servicecomb-service-center/datasource/mongo"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
-	"github.com/apache/servicecomb-service-center/pkg/log"
 )
 
 func init() {
@@ -62,20 +60,14 @@ func TestUpdateInstanceRefreshTime(t *testing.T) {
 		assert.Equal(t, nil, err)
 		err = updateInstanceRefreshTime(context.Background(), instance1.Instance.ServiceId, instance1.Instance.InstanceId)
 		assert.Equal(t, nil, err)
-		filter := bson.M{
-			mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  instance1.Instance.ServiceId,
-			mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instance1.Instance.InstanceId,
-		}
+		filter := util.NewFilter(util.InstanceServiceID(instance1.Instance.ServiceId), util.InstanceInstanceID(instance1.Instance.InstanceId))
 		result, err := client.GetMongoClient().FindOne(context.Background(), model.CollectionInstance, filter)
 		assert.Nil(t, err)
 		var ins model.Instance
 		err = result.Decode(&ins)
 		assert.Nil(t, err)
 		assert.NotEqual(t, instance1.RefreshTime, ins.RefreshTime)
-		filter = bson.M{
-			mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  instance1.Instance.ServiceId,
-			mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instance1.Instance.InstanceId,
-		}
+		filter = util.NewFilter(util.InstanceServiceID(instance1.Instance.ServiceId), util.InstanceInstanceID(instance1.Instance.InstanceId))
 		_, err = client.GetMongoClient().Delete(context.Background(), model.CollectionInstance, filter)
 		assert.Nil(t, err)
 	})
diff --git a/datasource/mongo/heartbeat/checker/heartbeatchecker_test.go b/datasource/mongo/heartbeat/checker/heartbeatchecker_test.go
index 6724a48..1abf13c 100644
--- a/datasource/mongo/heartbeat/checker/heartbeatchecker_test.go
+++ b/datasource/mongo/heartbeat/checker/heartbeatchecker_test.go
@@ -22,13 +22,11 @@ import (
 	"testing"
 	"time"
 
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	pb "github.com/go-chassis/cari/discovery"
 	"github.com/stretchr/testify/assert"
-	"go.mongodb.org/mongo-driver/bson"
-
-	"github.com/apache/servicecomb-service-center/datasource/mongo"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
 )
 
 func TestHeartbeat(t *testing.T) {
@@ -59,9 +57,7 @@ func TestHeartbeat(t *testing.T) {
 		})
 		assert.Nil(t, err)
 		assert.Equal(t, pb.ResponseSuccess, resp.Response.GetCode())
-		filter := bson.M{
-			mongo.StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instance1.Instance.InstanceId,
-		}
+		filter := util.NewFilter(util.InstanceInstanceID(instance1.Instance.InstanceId))
 		_, err = client.GetMongoClient().Delete(context.Background(), model.CollectionInstance, filter)
 		assert.Nil(t, err)
 	})
diff --git a/datasource/mongo/mongo.go b/datasource/mongo/mongo.go
index f7e813f..2d8ee89 100644
--- a/datasource/mongo/mongo.go
+++ b/datasource/mongo/mongo.go
@@ -26,8 +26,8 @@ import (
 
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/heartbeat"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/sd"
 	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/log"
@@ -120,14 +120,14 @@ func EnsureService() {
 	wrapCreateCollectionError(err)
 
 	serviceIDIndex := mutil.BuildIndexDoc(
-		StringBuilder([]string{model.ColumnService, model.ColumnServiceID}))
+		mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnServiceID}))
 	serviceIDIndex.Options = options.Index().SetUnique(true)
 
 	serviceIndex := mutil.BuildIndexDoc(
-		StringBuilder([]string{model.ColumnService, model.ColumnAppID}),
-		StringBuilder([]string{model.ColumnService, model.ColumnServiceName}),
-		StringBuilder([]string{model.ColumnService, model.ColumnEnv}),
-		StringBuilder([]string{model.ColumnService, model.ColumnVersion}),
+		mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnAppID}),
+		mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnServiceName}),
+		mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnEnv}),
+		mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}),
 		model.ColumnDomain,
 		model.ColumnProject)
 	serviceIndex.Options = options.Index().SetUnique(true)
@@ -146,7 +146,7 @@ func EnsureInstance() {
 	instanceIndex := mutil.BuildIndexDoc(model.ColumnRefreshTime)
 	instanceIndex.Options = options.Index().SetExpireAfterSeconds(defaultExpireTime)
 
-	instanceServiceIndex := mutil.BuildIndexDoc(StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}))
+	instanceServiceIndex := mutil.BuildIndexDoc(mutil.ConnectWithDot([]string{model.ColumnInstance, model.ColumnServiceID}))
 
 	var instanceIndexs []mongo.IndexModel
 	instanceIndexs = append(instanceIndexs, instanceIndex, instanceServiceIndex)
diff --git a/datasource/mongo/ms.go b/datasource/mongo/ms.go
index 386b56f..ac2f231 100644
--- a/datasource/mongo/ms.go
+++ b/datasource/mongo/ms.go
@@ -37,8 +37,9 @@ import (
 
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/heartbeat"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/sd"
 	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/gopool"
@@ -49,8 +50,9 @@ import (
 	"github.com/apache/servicecomb-service-center/server/plugin/uuid"
 )
 
-func (ds *DataSource) RegisterService(ctx context.Context, request *discovery.CreateServiceRequest) (
-	*discovery.CreateServiceResponse, error) {
+const baseTen = 10
+
+func (ds *DataSource) RegisterService(ctx context.Context, request *discovery.CreateServiceRequest) (*discovery.CreateServiceResponse, error) {
 	service := request.Service
 	remoteIP := util.GetIPFromContext(ctx)
 	domain := util.ParseDomain(ctx)
@@ -136,15 +138,13 @@ func (ds *DataSource) RegisterService(ctx context.Context, request *discovery.Cr
 	}, nil
 }
 
-func (ds *DataSource) GetServices(ctx context.Context, request *discovery.GetServicesRequest) (
-	*discovery.GetServicesResponse, error) {
-
+func (ds *DataSource) GetServices(ctx context.Context, request *discovery.GetServicesRequest) (*discovery.GetServicesResponse, error) {
 	domain := util.ParseDomain(ctx)
 	project := util.ParseProject(ctx)
 
 	filter := bson.M{model.ColumnDomain: domain, model.ColumnProject: project}
 
-	services, err := GetServices(ctx, filter)
+	services, err := dao.GetMicroServices(ctx, filter)
 	if err != nil {
 		return &discovery.GetServicesResponse{
 			Response: discovery.CreateResponse(discovery.ErrInternal, "get services data failed."),
@@ -164,9 +164,9 @@ func (ds *DataSource) GetApplications(ctx context.Context, request *discovery.Ge
 	filter := bson.M{
 		model.ColumnDomain:  domain,
 		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnService, model.ColumnEnv}): request.Environment}
+		mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnEnv}): request.Environment}
 
-	services, err := GetServices(ctx, filter)
+	services, err := dao.GetMicroServices(ctx, filter)
 	if err != nil {
 		return &discovery.GetAppsResponse{
 			Response: discovery.CreateResponse(discovery.ErrInternal, "get services data failed."),
@@ -196,8 +196,7 @@ func (ds *DataSource) GetApplications(ctx context.Context, request *discovery.Ge
 	}, nil
 }
 
-func (ds *DataSource) GetService(ctx context.Context, request *discovery.GetServiceRequest) (
-	*discovery.GetServiceResponse, error) {
+func (ds *DataSource) GetService(ctx context.Context, request *discovery.GetServiceRequest) (*discovery.GetServiceResponse, error) {
 	svc, err := GetServiceByID(ctx, request.ServiceId)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
@@ -292,7 +291,8 @@ func (ds *DataSource) DelServicePri(ctx context.Context, serviceID string, force
 		log.Error(fmt.Sprintf("%s micro-service %s failed, operator: %s", title, serviceID, remoteIP), mutil.ErrNotAllowDeleteSC)
 		return discovery.CreateResponse(discovery.ErrInvalidParams, mutil.ErrNotAllowDeleteSC.Error()), nil
 	}
-	microservice, err := GetService(ctx, GeneratorServiceFilter(ctx, serviceID))
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(serviceID))
+	microservice, err := dao.GetService(ctx, filter)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("%s micro-service %s failed, service does not exist, operator: %s",
@@ -318,7 +318,7 @@ func (ds *DataSource) DelServicePri(ctx context.Context, serviceID string, force
 			return discovery.CreateResponse(discovery.ErrDependedOnConsumer, "Can not delete this service, other service rely it."), err
 		}
 		//todo wait for dep interface
-		instancesExist, err := client.GetMongoClient().DocExist(ctx, model.CollectionInstance, bson.M{StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}): serviceID})
+		instancesExist, err := client.GetMongoClient().DocExist(ctx, model.CollectionInstance, bson.M{mutil.ConnectWithDot([]string{model.ColumnInstance, model.ColumnServiceID}): serviceID})
 		if err != nil {
 			log.Error(fmt.Sprintf("delete micro-service[%s] failed, get instances number failed, operator: %s",
 				serviceID, remoteIP), err)
@@ -334,8 +334,8 @@ func (ds *DataSource) DelServicePri(ctx context.Context, serviceID string, force
 
 	schemaOps := client.MongoOperation{Table: model.CollectionSchema, Models: []mongo.WriteModel{mongo.NewDeleteManyModel().SetFilter(bson.M{model.ColumnServiceID: serviceID})}}
 	rulesOps := client.MongoOperation{Table: model.CollectionRule, Models: []mongo.WriteModel{mongo.NewDeleteManyModel().SetFilter(bson.M{model.ColumnServiceID: serviceID})}}
-	instanceOps := client.MongoOperation{Table: model.CollectionInstance, Models: []mongo.WriteModel{mongo.NewDeleteManyModel().SetFilter(bson.M{StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}): serviceID})}}
-	serviceOps := client.MongoOperation{Table: model.CollectionService, Models: []mongo.WriteModel{mongo.NewDeleteOneModel().SetFilter(bson.M{StringBuilder([]string{model.ColumnService, model.ColumnServiceID}): serviceID})}}
+	instanceOps := client.MongoOperation{Table: model.CollectionInstance, Models: []mongo.WriteModel{mongo.NewDeleteManyModel().SetFilter(bson.M{mutil.ConnectWithDot([]string{model.ColumnInstance, model.ColumnServiceID}): serviceID})}}
+	serviceOps := client.MongoOperation{Table: model.CollectionService, Models: []mongo.WriteModel{mongo.NewDeleteOneModel().SetFilter(bson.M{mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnServiceID}): serviceID})}}
 
 	err = client.GetMongoClient().MultiTableBatchUpdate(ctx, []client.MongoOperation{schemaOps, rulesOps, instanceOps, serviceOps})
 	if err != nil {
@@ -362,13 +362,16 @@ func (ds *DataSource) DelServicePri(ctx context.Context, serviceID string, force
 	return discovery.CreateResponse(discovery.ResponseSuccess, "Unregister service successfully."), nil
 }
 
-func (ds *DataSource) UpdateService(ctx context.Context, request *discovery.UpdateServicePropsRequest) (
-	*discovery.UpdateServicePropsResponse, error) {
-	updateData := bson.M{
-		"$set": bson.M{
-			StringBuilder([]string{model.ColumnService, model.ColumnModTime}):  strconv.FormatInt(time.Now().Unix(), 10),
-			StringBuilder([]string{model.ColumnService, model.ColumnProperty}): request.Properties}}
-	err := UpdateService(ctx, GeneratorServiceFilter(ctx, request.ServiceId), updateData)
+func (ds *DataSource) UpdateService(ctx context.Context, request *discovery.UpdateServicePropsRequest) (*discovery.UpdateServicePropsResponse, error) {
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
+	setFilter := mutil.NewFilter(
+		mutil.ServiceModTime(strconv.FormatInt(time.Now().Unix(), baseTen)),
+		mutil.ServiceProperty(request.Properties),
+	)
+	updateFilter := mutil.NewFilter(
+		mutil.Set(setFilter),
+	)
+	err := dao.UpdateService(ctx, filter, updateFilter)
 	if err != nil {
 		log.Error(fmt.Sprintf("update service %s properties failed, update mongo failed", request.ServiceId), err)
 		return &discovery.UpdateServicePropsResponse{
@@ -380,8 +383,7 @@ func (ds *DataSource) UpdateService(ctx context.Context, request *discovery.Upda
 	}, nil
 }
 
-func (ds *DataSource) GetDeleteServiceFunc(ctx context.Context, serviceID string, force bool,
-	serviceRespChan chan<- *discovery.DelServicesRspInfo) func(context.Context) {
+func (ds *DataSource) GetDeleteServiceFunc(ctx context.Context, serviceID string, force bool, serviceRespChan chan<- *discovery.DelServicesRspInfo) func(context.Context) {
 	return func(_ context.Context) {
 		serviceRst := &discovery.DelServicesRspInfo{
 			ServiceId:  serviceID,
@@ -398,9 +400,9 @@ func (ds *DataSource) GetDeleteServiceFunc(ctx context.Context, serviceID string
 	}
 }
 
-func (ds *DataSource) GetServiceDetail(ctx context.Context, request *discovery.GetServiceRequest) (
-	*discovery.GetServiceDetailResponse, error) {
-	mgSvc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId))
+func (ds *DataSource) GetServiceDetail(ctx context.Context, request *discovery.GetServiceRequest) (*discovery.GetServiceDetailResponse, error) {
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
+	mgSvc, err := dao.GetService(ctx, filter)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			return &discovery.GetServiceDetailResponse{
@@ -417,7 +419,12 @@ func (ds *DataSource) GetServiceDetail(ctx context.Context, request *discovery.G
 		AppId:       svc.AppId,
 		ServiceName: svc.ServiceName,
 	}
-	versions, err := GetServicesVersions(ctx, GeneratorServiceVersionsFilter(ctx, key))
+	filter = mutil.NewBasicFilter(ctx,
+		mutil.ServiceEnv(key.Environment),
+		mutil.ServiceAppID(key.AppId),
+		mutil.ServiceServiceName(key.ServiceName),
+	)
+	versions, err := dao.GetServicesVersions(ctx, filter)
 	if err != nil {
 		log.Error(fmt.Sprintf("get service %s %s %s all versions failed", svc.Environment, svc.AppId, svc.ServiceName), err)
 		return &discovery.GetServiceDetailResponse{
@@ -440,8 +447,7 @@ func (ds *DataSource) GetServiceDetail(ctx context.Context, request *discovery.G
 
 }
 
-func (ds *DataSource) GetServicesInfo(ctx context.Context, request *discovery.GetServicesInfoRequest) (
-	*discovery.GetServicesInfoResponse, error) {
+func (ds *DataSource) GetServicesInfo(ctx context.Context, request *discovery.GetServicesInfoRequest) (*discovery.GetServicesInfoResponse, error) {
 	optionMap := make(map[string]struct{}, len(request.Options))
 	for _, opt := range request.Options {
 		optionMap[opt] = struct{}{}
@@ -472,7 +478,7 @@ func (ds *DataSource) GetServicesInfo(ctx context.Context, request *discovery.Ge
 			}, nil
 		}
 	}
-	services, err := GetMongoServices(ctx, bson.M{})
+	services, err := dao.GetServices(ctx, bson.M{})
 	if err != nil {
 		log.Error("get all services by domain failed", err)
 		return &discovery.GetServicesInfoResponse{
@@ -512,7 +518,14 @@ func (ds *DataSource) GetServicesInfo(ctx context.Context, request *discovery.Ge
 }
 
 func (ds *DataSource) AddTags(ctx context.Context, request *discovery.AddServiceTagsRequest) (*discovery.AddServiceTagsResponse, error) {
-	err := UpdateService(ctx, GeneratorServiceFilter(ctx, request.ServiceId), bson.M{"$set": bson.M{model.ColumnTag: request.Tags}})
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
+	setFilter := mutil.NewFilter(
+		mutil.Tags(request.Tags),
+	)
+	updateFilter := mutil.NewFilter(
+		mutil.Set(setFilter),
+	)
+	err := dao.UpdateService(ctx, filter, updateFilter)
 	if err == nil {
 		return &discovery.AddServiceTagsResponse{
 			Response: discovery.CreateResponse(discovery.ResponseSuccess, "Add service tags successfully."),
@@ -530,7 +543,8 @@ func (ds *DataSource) AddTags(ctx context.Context, request *discovery.AddService
 }
 
 func (ds *DataSource) GetTags(ctx context.Context, request *discovery.GetServiceTagsRequest) (*discovery.GetServiceTagsResponse, error) {
-	svc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId))
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
+	svc, err := dao.GetService(ctx, filter)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId))
@@ -550,7 +564,8 @@ func (ds *DataSource) GetTags(ctx context.Context, request *discovery.GetService
 }
 
 func (ds *DataSource) UpdateTag(ctx context.Context, request *discovery.UpdateServiceTagRequest) (*discovery.UpdateServiceTagResponse, error) {
-	svc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId))
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
+	svc, err := dao.GetService(ctx, filter)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId))
@@ -576,8 +591,13 @@ func (ds *DataSource) UpdateTag(ctx context.Context, request *discovery.UpdateSe
 		newTags[k] = v
 	}
 	newTags[request.Key] = request.Value
-
-	err = UpdateService(ctx, GeneratorServiceFilter(ctx, request.ServiceId), bson.M{"$set": bson.M{model.ColumnTag: newTags}})
+	setFilter := mutil.NewFilter(
+		mutil.Tags(newTags),
+	)
+	updateFilter := mutil.NewFilter(
+		mutil.Set(setFilter),
+	)
+	err = dao.UpdateService(ctx, filter, updateFilter)
 	if err != nil {
 		log.Error(fmt.Sprintf("update service %s tags failed", request.ServiceId), err)
 		return &discovery.UpdateServiceTagResponse{
@@ -590,7 +610,8 @@ func (ds *DataSource) UpdateTag(ctx context.Context, request *discovery.UpdateSe
 }
 
 func (ds *DataSource) DeleteTags(ctx context.Context, request *discovery.DeleteServiceTagsRequest) (*discovery.DeleteServiceTagsResponse, error) {
-	svc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId))
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
+	svc, err := dao.GetService(ctx, filter)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId))
@@ -618,7 +639,13 @@ func (ds *DataSource) DeleteTags(ctx context.Context, request *discovery.DeleteS
 			delete(newTags, key)
 		}
 	}
-	err = UpdateService(ctx, GeneratorServiceFilter(ctx, request.ServiceId), bson.M{"$set": bson.M{model.ColumnTag: newTags}})
+	setFilter := mutil.NewFilter(
+		mutil.Tags(newTags),
+	)
+	updateFilter := mutil.NewFilter(
+		mutil.Set(setFilter),
+	)
+	err = dao.UpdateService(ctx, filter, updateFilter)
 	if err != nil {
 		log.Error(fmt.Sprintf("delete service %s tags failed", request.ServiceId), err)
 		return &discovery.DeleteServiceTagsResponse{
@@ -642,7 +669,8 @@ func (ds *DataSource) GetSchema(ctx context.Context, request *discovery.GetSchem
 			Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "GetSchema service does not exist."),
 		}, nil
 	}
-	schema, err := GetSchema(ctx, GeneratorSchemaFilter(ctx, request.ServiceId, request.SchemaId))
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceID(request.ServiceId), mutil.SchemaID(request.SchemaId))
+	schema, err := dao.GetSchema(ctx, filter)
 	if err != nil {
 		return &discovery.GetSchemaResponse{
 			Response: discovery.CreateResponse(discovery.ErrInternal, "GetSchema failed from mongodb."),
@@ -661,7 +689,10 @@ func (ds *DataSource) GetSchema(ctx context.Context, request *discovery.GetSchem
 }
 
 func (ds *DataSource) GetAllSchemas(ctx context.Context, request *discovery.GetAllSchemaRequest) (*discovery.GetAllSchemaResponse, error) {
-	svc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId))
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
+	filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(request.ServiceId))
+	svc, err := dao.GetService(ctx, filter)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("service %s not exist in db", request.ServiceId))
@@ -685,7 +716,8 @@ func (ds *DataSource) GetAllSchemas(ctx context.Context, request *discovery.GetA
 	for _, schemaID := range schemasList {
 		tempSchema := &discovery.Schema{}
 		tempSchema.SchemaId = schemaID
-		schema, err := GetSchema(ctx, GeneratorSchemaFilter(ctx, request.ServiceId, schemaID))
+		filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId), mutil.SchemaID(schemaID))
+		schema, err := dao.GetSchema(ctx, filter)
 		if err != nil {
 			return &discovery.GetAllSchemaResponse{
 				Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
@@ -719,7 +751,8 @@ func (ds *DataSource) ExistSchema(ctx context.Context, request *discovery.GetExi
 			Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "ExistSchema failed for service not exist"),
 		}, nil
 	}
-	Schema, err := GetSchema(ctx, GeneratorSchemaFilter(ctx, request.ServiceId, request.SchemaId))
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceID(request.ServiceId), mutil.SchemaID(request.SchemaId))
+	Schema, err := dao.GetSchema(ctx, filter)
 	if err != nil {
 		return &discovery.GetExistenceResponse{
 			Response: discovery.CreateResponse(discovery.ErrInternal, "ExistSchema failed for get schema failed."),
@@ -750,7 +783,7 @@ func (ds *DataSource) DeleteSchema(ctx context.Context, request *discovery.Delet
 			Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "DeleteSchema failed for service not exist."),
 		}, nil
 	}
-	filter := GeneratorSchemaFilter(ctx, request.ServiceId, request.SchemaId)
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceID(request.ServiceId), mutil.SchemaID(request.SchemaId))
 	res, err := client.GetMongoClient().DocDelete(ctx, model.CollectionSchema, filter)
 	if err != nil {
 		return &discovery.DeleteSchemaResponse{
@@ -794,7 +827,8 @@ func (ds *DataSource) ModifySchema(ctx context.Context, request *discovery.Modif
 }
 
 func (ds *DataSource) ModifySchemas(ctx context.Context, request *discovery.ModifySchemasRequest) (*discovery.ModifySchemasResponse, error) {
-	svc, err := GetService(ctx, GeneratorServiceFilter(ctx, request.ServiceId))
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ServiceId))
+	svc, err := dao.GetService(ctx, filter)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			return &discovery.ModifySchemasResponse{Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "Service not exist")}, nil
@@ -821,9 +855,9 @@ func (ds *DataSource) modifySchemas(ctx context.Context, service *discovery.Micr
 	domain := util.ParseDomain(ctx)
 	project := util.ParseProject(ctx)
 	remoteIP := util.GetIPFromContext(ctx)
-
 	serviceID := service.ServiceId
-	schemasFromDatabase, err := GetSchemas(ctx, bson.M{model.ColumnServiceID: serviceID})
+	filter := mutil.NewFilter(mutil.ServiceID(serviceID))
+	schemasFromDatabase, err := dao.GetSchemas(ctx, filter)
 	if err != nil {
 		log.Error(fmt.Sprintf("modify service %s schemas failed, get schemas failed, operator: %s", serviceID, remoteIP), err)
 		return discovery.NewError(discovery.ErrUnavailableBackend, err.Error())
@@ -842,7 +876,10 @@ func (ds *DataSource) modifySchemas(ctx context.Context, service *discovery.Micr
 				log.Error(fmt.Sprintf("modify service[%s] schemas failed, operator: %s", serviceID, remoteIP), errQuota)
 				return errQuota
 			}
-			serviceOps = append(serviceOps, mongo.NewUpdateOneModel().SetUpdate(bson.M{"$set": bson.M{StringBuilder([]string{model.ColumnService, model.ColumnSchemas}): nonExistSchemaIds}}).SetFilter(GeneratorServiceFilter(ctx, serviceID)))
+			filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(serviceID))
+			setFilter := mutil.NewFilter(mutil.ServiceSchemas(nonExistSchemaIds))
+			updateFilter := mutil.NewFilter(mutil.Set(setFilter))
+			serviceOps = append(serviceOps, mongo.NewUpdateOneModel().SetUpdate(updateFilter).SetFilter(filter))
 		} else {
 			if len(nonExistSchemaIds) != 0 {
 				errInfo := fmt.Errorf("non-existent schemaIDs %v", nonExistSchemaIds)
@@ -850,12 +887,20 @@ func (ds *DataSource) modifySchemas(ctx context.Context, service *discovery.Micr
 				return discovery.NewError(discovery.ErrUndefinedSchemaID, errInfo.Error())
 			}
 			for _, needUpdateSchema := range needUpdateSchemas {
-				exist, err := SchemaSummaryExist(ctx, serviceID, needUpdateSchema.SchemaId)
+				exist, err := dao.SchemaSummaryExist(ctx, serviceID, needUpdateSchema.SchemaId)
 				if err != nil {
 					return discovery.NewError(discovery.ErrInternal, err.Error())
 				}
 				if !exist {
-					schemasOps = append(schemasOps, mongo.NewUpdateOneModel().SetFilter(GeneratorSchemaFilter(ctx, serviceID, needUpdateSchema.SchemaId)).SetUpdate(bson.M{"$set": bson.M{model.ColumnSchema: needUpdateSchema.Schema, model.ColumnSchemaSummary: needUpdateSchema.Summary}}))
+					filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(serviceID), mutil.SchemaID(needUpdateSchema.SchemaId))
+					setFilter := mutil.NewFilter(
+						mutil.Schema(needUpdateSchema.Schema),
+						mutil.SchemaSummary(needUpdateSchema.Summary),
+					)
+					updateFilter := mutil.NewFilter(
+						mutil.Set(setFilter),
+					)
+					schemasOps = append(schemasOps, mongo.NewUpdateOneModel().SetFilter(filter).SetUpdate(updateFilter))
 				} else {
 					log.Warn(fmt.Sprintf("schema[%s/%s] and it's summary already exist, skip to update, operator: %s",
 						serviceID, needUpdateSchema.SchemaId, remoteIP))
@@ -900,16 +945,27 @@ func (ds *DataSource) modifySchemas(ctx context.Context, service *discovery.Micr
 
 		for _, schema := range needUpdateSchemas {
 			log.Info(fmt.Sprintf("update schema[%s/%s], operator: %s", serviceID, schema.SchemaId, remoteIP))
-			schemasOps = append(schemasOps, mongo.NewUpdateOneModel().SetFilter(GeneratorSchemaFilter(ctx, serviceID, schema.SchemaId)).SetUpdate(bson.M{"$set": bson.M{model.ColumnSchema: schema.Schema, model.ColumnSchemaSummary: schema.Summary}}))
+			filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(serviceID), mutil.SchemaID(schema.SchemaId))
+			setFilter := mutil.NewFilter(
+				mutil.Schema(schema.Schema),
+				mutil.SchemaSummary(schema.Summary),
+			)
+			updateFilter := mutil.NewFilter(
+				mutil.Set(setFilter),
+			)
+			schemasOps = append(schemasOps, mongo.NewUpdateOneModel().SetFilter(filter).SetUpdate(updateFilter))
 			schemaIDs = append(schemaIDs, schema.SchemaId)
 		}
 
 		for _, schema := range needDeleteSchemas {
 			log.Info(fmt.Sprintf("delete non-existent schema[%s/%s], operator: %s", serviceID, schema.SchemaId, remoteIP))
-			schemasOps = append(schemasOps, mongo.NewDeleteOneModel().SetFilter(GeneratorSchemaFilter(ctx, serviceID, schema.SchemaId)))
+			filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(serviceID), mutil.SchemaID(schema.SchemaId))
+			schemasOps = append(schemasOps, mongo.NewDeleteOneModel().SetFilter(filter))
 		}
-
-		serviceOps = append(serviceOps, mongo.NewUpdateOneModel().SetUpdate(bson.M{"$set": bson.M{StringBuilder([]string{model.ColumnService, model.ColumnSchemas}): schemaIDs}}).SetFilter(GeneratorServiceFilter(ctx, serviceID)))
+		filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(serviceID))
+		setFilter := mutil.NewFilter(mutil.ServiceSchemas(schemaIDs))
+		updateFilter := mutil.NewFilter(mutil.Set(setFilter))
+		serviceOps = append(serviceOps, mongo.NewUpdateOneModel().SetUpdate(updateFilter).SetFilter(filter))
 	}
 	if len(schemasOps) > 0 {
 		_, err = client.GetMongoClient().BatchUpdate(ctx, model.CollectionSchema, schemasOps)
@@ -932,8 +988,11 @@ func (ds *DataSource) modifySchemas(ctx context.Context, service *discovery.Micr
 // 3.service is editable && service have no relation with the schema --> update the schema && update the service
 // 4.service can't edit && service have relation with the schema && schema summary not exist --> update the schema
 func (ds *DataSource) modifySchema(ctx context.Context, serviceID string, schema *discovery.Schema) *discovery.Error {
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
+	filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(serviceID))
 	remoteIP := util.GetIPFromContext(ctx)
-	svc, err := GetService(ctx, GeneratorServiceFilter(ctx, serviceID))
+	svc, err := dao.GetService(ctx, filter)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			return discovery.NewError(discovery.ErrServiceNotExists, "Service does not exist.")
@@ -953,7 +1012,8 @@ func (ds *DataSource) modifySchema(ctx context.Context, serviceID string, schema
 		if len(microservice.Schemas) != 0 && !isExist {
 			return discovery.NewError(discovery.ErrUndefinedSchemaID, "Non-existent schemaID can't be added request "+discovery.ENV_PROD)
 		}
-		respSchema, err := GetSchema(ctx, GeneratorSchemaFilter(ctx, serviceID, schema.SchemaId))
+		filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(serviceID), mutil.SchemaID(schema.SchemaId))
+		respSchema, err := dao.GetSchema(ctx, filter)
 		if err != nil {
 			return discovery.NewError(discovery.ErrUnavailableBackend, err.Error())
 		}
@@ -981,14 +1041,25 @@ func (ds *DataSource) modifySchema(ctx context.Context, serviceID string, schema
 		}
 	}
 	if len(newSchemas) != 0 {
-		updateData := bson.M{StringBuilder([]string{model.ColumnService, model.ColumnSchemas}): newSchemas}
-		err = UpdateService(ctx, GeneratorServiceFilter(ctx, serviceID), bson.M{"$set": updateData})
+		filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(serviceID))
+		setFilter := mutil.NewFilter(
+			mutil.ServiceSchemas(newSchemas),
+		)
+		updateFilter := mutil.NewFilter(
+			mutil.Set(setFilter),
+		)
+		err = dao.UpdateService(ctx, filter, updateFilter)
 		if err != nil {
 			return discovery.NewError(discovery.ErrInternal, err.Error())
 		}
 	}
-	newSchema := bson.M{"$set": bson.M{model.ColumnSchema: schema.Schema, model.ColumnSchemaSummary: schema.Summary}}
-	err = UpdateSchema(ctx, GeneratorSchemaFilter(ctx, serviceID, schema.SchemaId), newSchema, options.FindOneAndUpdate().SetUpsert(true))
+	filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(serviceID), mutil.SchemaID(schema.SchemaId))
+	setFilter := mutil.NewFilter(
+		mutil.Schema(schema.Schema),
+		mutil.SchemaSummary(schema.Summary),
+	)
+	updateFilter := mutil.NewFilter(mutil.Set(setFilter))
+	err = dao.UpdateSchema(ctx, filter, updateFilter, options.FindOneAndUpdate().SetUpsert(true))
 	if err != nil {
 		return discovery.NewError(discovery.ErrInternal, err.Error())
 	}
@@ -997,6 +1068,8 @@ func (ds *DataSource) modifySchema(ctx context.Context, serviceID string, schema
 
 func (ds *DataSource) AddRule(ctx context.Context, request *discovery.AddServiceRulesRequest) (*discovery.AddServiceRulesResponse, error) {
 	remoteIP := util.GetIPFromContext(ctx)
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
 	exist, err := ServiceExistID(ctx, request.ServiceId)
 	if err != nil {
 		log.Error(fmt.Sprintf("failed to add rules for service %s for get service failed", request.ServiceId), err)
@@ -1019,7 +1092,8 @@ func (ds *DataSource) AddRule(ctx context.Context, request *discovery.AddService
 		}
 		return response, nil
 	}
-	rules, err := GetRules(ctx, request.ServiceId)
+	filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId))
+	rules, err := dao.GetServiceRules(ctx, filter)
 	if err != nil {
 		return &discovery.AddServiceRulesResponse{
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
@@ -1039,7 +1113,12 @@ func (ds *DataSource) AddRule(ctx context.Context, request *discovery.AddService
 			}, nil
 		}
 		//the rule unique index is (serviceid,attribute,pattern)
-		exist, err := RuleExist(ctx, GeneratorRuleAttFilter(ctx, request.ServiceId, rule.Attribute, rule.Pattern))
+		filter = mutil.NewFilter(
+			mutil.ServiceID(request.ServiceId),
+			mutil.RuleAttribute(rule.Attribute),
+			mutil.RulePattern(rule.Pattern),
+		)
+		exist, err := dao.RuleExist(ctx, filter)
 		if err != nil {
 			return &discovery.AddServiceRulesResponse{
 				Response: discovery.CreateResponse(discovery.ErrUnavailableBackend, "Can not check rule if exist."),
@@ -1077,8 +1156,7 @@ func (ds *DataSource) AddRule(ctx context.Context, request *discovery.AddService
 	}, nil
 }
 
-func (ds *DataSource) GetRules(ctx context.Context, request *discovery.GetServiceRulesRequest) (
-	*discovery.GetServiceRulesResponse, error) {
+func (ds *DataSource) GetRules(ctx context.Context, request *discovery.GetServiceRulesRequest) (*discovery.GetServiceRulesResponse, error) {
 	exist, err := ServiceExistID(ctx, request.ServiceId)
 	if err != nil {
 		return &discovery.GetServiceRulesResponse{
@@ -1090,7 +1168,8 @@ func (ds *DataSource) GetRules(ctx context.Context, request *discovery.GetServic
 			Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "GetRules failed for service not exist."),
 		}, nil
 	}
-	rules, err := GetRules(ctx, request.ServiceId)
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceID(request.ServiceId))
+	rules, err := dao.GetServiceRules(ctx, filter)
 	if err != nil {
 		return &discovery.GetServiceRulesResponse{
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
@@ -1102,9 +1181,10 @@ func (ds *DataSource) GetRules(ctx context.Context, request *discovery.GetServic
 	}, nil
 }
 
-func (ds *DataSource) DeleteRule(ctx context.Context, request *discovery.DeleteServiceRulesRequest) (
-	*discovery.DeleteServiceRulesResponse, error) {
+func (ds *DataSource) DeleteRule(ctx context.Context, request *discovery.DeleteServiceRulesRequest) (*discovery.DeleteServiceRulesResponse, error) {
 	exist, err := ServiceExistID(ctx, request.ServiceId)
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
 	if err != nil {
 		log.Error(fmt.Sprintf("failed to add tags for service %s for get service failed", request.ServiceId), err)
 		return &discovery.DeleteServiceRulesResponse{
@@ -1116,7 +1196,8 @@ func (ds *DataSource) DeleteRule(ctx context.Context, request *discovery.DeleteS
 	}
 	var delRules []mongo.WriteModel
 	for _, ruleID := range request.RuleIds {
-		exist, err := RuleExist(ctx, GeneratorRuleFilter(ctx, request.ServiceId, ruleID))
+		filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId), mutil.RuleRuleID(ruleID))
+		exist, err := dao.RuleExist(ctx, filter)
 		if err != nil {
 			return &discovery.DeleteServiceRulesResponse{
 				Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
@@ -1127,7 +1208,8 @@ func (ds *DataSource) DeleteRule(ctx context.Context, request *discovery.DeleteS
 				Response: discovery.CreateResponse(discovery.ErrRuleNotExists, "This rule does not exist."),
 			}, nil
 		}
-		delRules = append(delRules, mongo.NewDeleteOneModel().SetFilter(GeneratorRuleFilter(ctx, request.ServiceId, ruleID)))
+		filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId), mutil.RuleRuleID(ruleID))
+		delRules = append(delRules, mongo.NewDeleteOneModel().SetFilter(filter))
 	}
 	if len(delRules) > 0 {
 		_, err := client.GetMongoClient().BatchDelete(ctx, model.CollectionRule, delRules)
@@ -1141,8 +1223,10 @@ func (ds *DataSource) DeleteRule(ctx context.Context, request *discovery.DeleteS
 		Response: discovery.CreateResponse(discovery.ResponseSuccess, "Delete service rules successfully."),
 	}, nil
 }
-func (ds *DataSource) UpdateRule(ctx context.Context, request *discovery.UpdateServiceRuleRequest) (
-	*discovery.UpdateServiceRuleResponse, error) {
+
+func (ds *DataSource) UpdateRule(ctx context.Context, request *discovery.UpdateServiceRuleRequest) (*discovery.UpdateServiceRuleResponse, error) {
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
 	exist, err := ServiceExistID(ctx, request.ServiceId)
 	if err != nil {
 		return &discovery.UpdateServiceRuleResponse{
@@ -1154,7 +1238,8 @@ func (ds *DataSource) UpdateRule(ctx context.Context, request *discovery.UpdateS
 			Response: discovery.CreateResponse(discovery.ErrServiceNotExists, "UpdateRule failed for service not exist."),
 		}, nil
 	}
-	rules, err := GetRules(ctx, request.ServiceId)
+	filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId))
+	rules, err := dao.GetServiceRules(ctx, filter)
 	if err != nil {
 		return &discovery.UpdateServiceRuleResponse{
 			Response: discovery.CreateResponse(discovery.ErrUnavailableBackend, "UpdateRule failed for get rule."),
@@ -1165,7 +1250,8 @@ func (ds *DataSource) UpdateRule(ctx context.Context, request *discovery.UpdateS
 			Response: discovery.CreateResponse(discovery.ErrModifyRuleNotAllow, "Exist multiple rules, can not change rule type. Rule type is ."+rules[0].RuleType),
 		}, nil
 	}
-	exist, err = RuleExist(ctx, GeneratorRuleFilter(ctx, request.ServiceId, request.RuleId))
+	filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId), mutil.RuleRuleID(request.RuleId))
+	exist, err = dao.RuleExist(ctx, filter)
 	if err != nil {
 		return &discovery.UpdateServiceRuleResponse{
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
@@ -1176,15 +1262,16 @@ func (ds *DataSource) UpdateRule(ctx context.Context, request *discovery.UpdateS
 			Response: discovery.CreateResponse(discovery.ErrRuleNotExists, "This rule does not exist."),
 		}, nil
 	}
-
-	newRule := bson.M{
-		StringBuilder([]string{model.ColumnRule, model.ColumnRuleType}):    request.Rule.RuleType,
-		StringBuilder([]string{model.ColumnRule, model.ColumnPattern}):     request.Rule.Pattern,
-		StringBuilder([]string{model.ColumnRule, model.ColumnAttribute}):   request.Rule.Attribute,
-		StringBuilder([]string{model.ColumnRule, model.ColumnDescription}): request.Rule.Description,
-		StringBuilder([]string{model.ColumnRule, model.ColumnModTime}):     strconv.FormatInt(time.Now().Unix(), 10)}
-
-	err = UpdateRule(ctx, GeneratorRuleFilter(ctx, request.ServiceId, request.RuleId), bson.M{"$set": newRule})
+	filter = mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(request.ServiceId), mutil.RuleRuleID(request.RuleId))
+	setFilter := mutil.NewFilter(
+		mutil.RuleRuleType(request.Rule.RuleType),
+		mutil.RulePattern(request.Rule.Pattern),
+		mutil.RuleAttribute(request.Rule.Attribute),
+		mutil.RuleDescription(request.Rule.Description),
+		mutil.RuleModTime(strconv.FormatInt(time.Now().Unix(), baseTen)),
+	)
+	updateFilter := mutil.NewFilter(mutil.Set(setFilter))
+	err = dao.UpdateRule(ctx, filter, updateFilter)
 	if err != nil {
 		return &discovery.UpdateServiceRuleResponse{
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
@@ -1199,88 +1286,17 @@ func (ds *DataSource) isSchemaEditable(service *discovery.MicroService) bool {
 	return (len(service.Environment) != 0 && service.Environment != discovery.ENV_PROD) || ds.SchemaEditable
 }
 
-func ServiceExist(ctx context.Context, service *discovery.MicroServiceKey) (bool, error) {
-	filter := GeneratorServiceNameFilter(ctx, service)
-	return client.GetMongoClient().DocExist(ctx, model.CollectionService, filter)
-}
-
 func ServiceExistID(ctx context.Context, serviceID string) (bool, error) {
-	filter := GeneratorServiceFilter(ctx, serviceID)
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(serviceID))
 	return client.GetMongoClient().DocExist(ctx, model.CollectionService, filter)
 }
 
-func GetService(ctx context.Context, filter bson.M) (*model.Service, error) {
-	findRes, err := client.GetMongoClient().FindOne(ctx, model.CollectionService, filter)
-	if err != nil {
-		return nil, err
-	}
-	var svc *model.Service
-	if findRes.Err() != nil {
-		//not get any service,not db err
-		return nil, datasource.ErrNoData
-	}
-	err = findRes.Decode(&svc)
-	if err != nil {
-		return nil, err
-	}
-	return svc, nil
-}
-
-func GetServices(ctx context.Context, filter bson.M) ([]*discovery.MicroService, error) {
-	res, err := client.GetMongoClient().Find(ctx, model.CollectionService, filter)
-	if err != nil {
-		return nil, err
-	}
-	var services []*discovery.MicroService
-	for res.Next(ctx) {
-		var tmp model.Service
-		err := res.Decode(&tmp)
-		if err != nil {
-			return nil, err
-		}
-		services = append(services, tmp.Service)
-	}
-	return services, nil
-}
-
-func GetMongoServices(ctx context.Context, filter bson.M) ([]*model.Service, error) {
-	res, err := client.GetMongoClient().Find(ctx, model.CollectionService, filter)
-	if err != nil {
-		return nil, err
-	}
-	var services []*model.Service
-	for res.Next(ctx) {
-		var tmp *model.Service
-		err := res.Decode(&tmp)
-		if err != nil {
-			return nil, err
-		}
-		services = append(services, tmp)
-	}
-	return services, nil
-}
-
-func GetServicesVersions(ctx context.Context, filter interface{}) ([]string, error) {
-	res, err := client.GetMongoClient().Find(ctx, model.CollectionService, filter)
-	if err != nil {
-		return nil, nil
-	}
-	var versions []string
-	for res.Next(ctx) {
-		var tmp model.Service
-		err := res.Decode(&tmp)
-		if err != nil {
-			return nil, err
-		}
-		versions = append(versions, tmp.Service.Version)
-	}
-	return versions, nil
-}
-
 func getServiceDetailUtil(ctx context.Context, mgs *model.Service, countOnly bool, options []string) (*discovery.ServiceDetail, error) {
 	serviceDetail := new(discovery.ServiceDetail)
 	serviceID := mgs.Service.ServiceId
 	domainProject := util.ParseDomainProject(ctx)
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
 	if countOnly {
 		serviceDetail.Statics = new(discovery.Statistics)
 	}
@@ -1290,7 +1306,8 @@ func getServiceDetailUtil(ctx context.Context, mgs *model.Service, countOnly boo
 		case "tags":
 			serviceDetail.Tags = mgs.Tags
 		case "rules":
-			rules, err := GetRules(ctx, mgs.Service.ServiceId)
+			filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceID(mgs.Service.ServiceId))
+			rules, err := dao.GetServiceRules(ctx, filter)
 			if err != nil {
 				log.Error(fmt.Sprintf("get service %s's all rules failed", mgs.Service.ServiceId), err)
 				return nil, err
@@ -1301,7 +1318,8 @@ func getServiceDetailUtil(ctx context.Context, mgs *model.Service, countOnly boo
 			serviceDetail.Rules = rules
 		case "instances":
 			if countOnly {
-				instanceCount, err := GetInstanceCountOfOneService(ctx, serviceID)
+				filter := mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(serviceID))
+				instanceCount, err := dao.CountInstance(ctx, filter)
 				if err != nil {
 					log.Error(fmt.Sprintf("get number of service [%s]'s instances failed", serviceID), err)
 					return nil, err
@@ -1311,14 +1329,16 @@ func getServiceDetailUtil(ctx context.Context, mgs *model.Service, countOnly boo
 				}
 				continue
 			}
-			instances, err := GetAllInstancesOfOneService(ctx, serviceID)
+			filter := mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(serviceID))
+			instances, err := dao.GetMicroServiceInstances(ctx, filter)
 			if err != nil {
 				log.Error(fmt.Sprintf("get service[%s]'s all instances failed", serviceID), err)
 				return nil, err
 			}
 			serviceDetail.Instances = instances
 		case "schemas":
-			schemas, err := GetSchemas(ctx, GeneratorServiceFilter(ctx, mgs.Service.ServiceId))
+			filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(serviceID))
+			schemas, err := dao.GetSchemas(ctx, filter)
 			if err != nil {
 				log.Error(fmt.Sprintf("get service %s's all schemas failed", mgs.Service.ServiceId), err)
 				return nil, err
@@ -1349,173 +1369,6 @@ func getServiceDetailUtil(ctx context.Context, mgs *model.Service, countOnly boo
 	return serviceDetail, nil
 }
 
-func UpdateService(ctx context.Context, filter interface{}, m bson.M) error {
-	return client.GetMongoClient().DocUpdate(ctx, model.CollectionService, filter, m)
-}
-
-func GetRules(ctx context.Context, serviceID string) ([]*discovery.ServiceRule, error) {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-	filter := bson.M{model.ColumnDomain: domain, model.ColumnProject: project, model.ColumnServiceID: serviceID}
-
-	ruleRes, err := client.GetMongoClient().Find(ctx, model.CollectionRule, filter)
-	if err != nil {
-		return nil, err
-	}
-	var rules []*discovery.ServiceRule
-	for ruleRes.Next(ctx) {
-		var tmpRule *model.Rule
-		err := ruleRes.Decode(&tmpRule)
-		if err != nil {
-			return nil, err
-		}
-		rules = append(rules, tmpRule.Rule)
-	}
-	return rules, nil
-}
-
-func UpdateRule(ctx context.Context, filter interface{}, m bson.M) error {
-	return client.GetMongoClient().DocUpdate(ctx, model.CollectionRule, filter, m)
-}
-
-func UpdateSchema(ctx context.Context, filter interface{}, m bson.M, opts ...*options.FindOneAndUpdateOptions) error {
-	_, err := client.GetMongoClient().FindOneAndUpdate(ctx, model.CollectionSchema, filter, m, opts...)
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func DeleteSchema(ctx context.Context, filter interface{}) error {
-	res, err := client.GetMongoClient().DocDelete(ctx, model.CollectionSchema, filter)
-	if err != nil {
-		return err
-	}
-	if !res {
-		return mutil.ErrDeleteSchemaFailed
-	}
-	return nil
-}
-
-func RuleExist(ctx context.Context, filter bson.M) (bool, error) {
-	return client.GetMongoClient().DocExist(ctx, model.CollectionRule, filter)
-}
-
-func GeneratorServiceFilter(ctx context.Context, serviceID string) bson.M {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-
-	return bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnService, model.ColumnServiceID}): serviceID}
-}
-
-func GeneratorServiceNameFilter(ctx context.Context, service *discovery.MicroServiceKey) bson.M {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-
-	return bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnService, model.ColumnEnv}):         service.Environment,
-		StringBuilder([]string{model.ColumnService, model.ColumnAppID}):       service.AppId,
-		StringBuilder([]string{model.ColumnService, model.ColumnServiceName}): service.ServiceName,
-		StringBuilder([]string{model.ColumnService, model.ColumnVersion}):     service.Version}
-}
-
-func GeneratorServiceAliasFilter(ctx context.Context, service *discovery.MicroServiceKey) bson.M {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-
-	return bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnService, model.ColumnEnv}):     service.Environment,
-		StringBuilder([]string{model.ColumnService, model.ColumnAppID}):   service.AppId,
-		StringBuilder([]string{model.ColumnService, model.ColumnAlias}):   service.Alias,
-		StringBuilder([]string{model.ColumnService, model.ColumnVersion}): service.Version}
-}
-
-func GeneratorRuleAttFilter(ctx context.Context, serviceID, attribute, pattern string) bson.M {
-	return bson.M{
-		model.ColumnServiceID: serviceID,
-		StringBuilder([]string{model.ColumnRule, model.ColumnAttribute}): attribute,
-		StringBuilder([]string{model.ColumnRule, model.ColumnPattern}):   pattern}
-}
-
-func GeneratorSchemaFilter(ctx context.Context, serviceID, schemaID string) bson.M {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-
-	return bson.M{model.ColumnDomain: domain, model.ColumnProject: project, model.ColumnServiceID: serviceID, model.ColumnSchemaID: schemaID}
-}
-
-func GeneratorRuleFilter(ctx context.Context, serviceID, ruleID string) bson.M {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-
-	return bson.M{
-		model.ColumnDomain:    domain,
-		model.ColumnProject:   project,
-		model.ColumnServiceID: serviceID,
-		StringBuilder([]string{model.ColumnRule, model.ColumnRuleID}): ruleID}
-}
-
-func GetSchemas(ctx context.Context, filter bson.M) ([]*discovery.Schema, error) {
-	getRes, err := client.GetMongoClient().Find(ctx, model.CollectionSchema, filter)
-	if err != nil {
-		return nil, err
-	}
-	var schemas []*discovery.Schema
-	for getRes.Next(ctx) {
-		var tmp *model.Schema
-		err = getRes.Decode(&tmp)
-		if err != nil {
-			return nil, err
-		}
-		schemas = append(schemas, &discovery.Schema{
-			SchemaId: tmp.SchemaID,
-			Summary:  tmp.SchemaSummary,
-			Schema:   tmp.Schema,
-		})
-	}
-	return schemas, nil
-}
-
-func GetSchema(ctx context.Context, filter bson.M) (*model.Schema, error) {
-	findRes, err := client.GetMongoClient().FindOne(ctx, model.CollectionSchema, filter)
-	if err != nil {
-		return nil, err
-	}
-	if findRes.Err() != nil {
-		//not get any service,not db err
-		return nil, nil
-	}
-	var schema *model.Schema
-	err = findRes.Decode(&schema)
-	if err != nil {
-		return nil, err
-	}
-	return schema, nil
-}
-
-func SchemaSummaryExist(ctx context.Context, serviceID, schemaID string) (bool, error) {
-	res, err := client.GetMongoClient().FindOne(ctx, model.CollectionSchema, GeneratorSchemaFilter(ctx, serviceID, schemaID))
-	if err != nil {
-		return false, err
-	}
-	if res.Err() != nil {
-		return false, nil
-	}
-	var s model.Schema
-	err = res.Decode(&s)
-	if err != nil {
-		return false, err
-	}
-	return len(s.SchemaSummary) != 0, nil
-}
-
 // Instance management
 func (ds *DataSource) RegisterInstance(ctx context.Context, request *discovery.RegisterInstanceRequest) (*discovery.RegisterInstanceResponse, error) {
 	remoteIP := util.GetIPFromContext(ctx)
@@ -1576,9 +1429,11 @@ func (ds *DataSource) GetInstance(ctx context.Context, request *discovery.GetOne
 	var service *model.Service
 	var err error
 	var serviceIDs []string
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
 	if len(request.ConsumerServiceId) > 0 {
-		filter := GeneratorServiceFilter(ctx, request.ConsumerServiceId)
-		service, err = GetService(ctx, filter)
+		filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(request.ConsumerServiceId))
+		service, err = dao.GetService(ctx, filter)
 		if err != nil {
 			if errors.Is(err, datasource.ErrNoData) {
 				log.Debug(fmt.Sprintf("consumer does not exist, consumer %s find provider instance %s %s",
@@ -1595,9 +1450,8 @@ func (ds *DataSource) GetInstance(ctx context.Context, request *discovery.GetOne
 			}, err
 		}
 	}
-
-	filter := GeneratorServiceFilter(ctx, request.ProviderServiceId)
-	provider, err := GetService(ctx, filter)
+	filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(request.ProviderServiceId))
+	provider, err := dao.GetService(ctx, filter)
 	if err != nil {
 		if errors.Is(err, datasource.ErrNoData) {
 			log.Debug(fmt.Sprintf("provider does not exist, consumer %s find provider instance %s %s",
@@ -1621,7 +1475,7 @@ func (ds *DataSource) GetInstance(ctx context.Context, request *discovery.GetOne
 	}
 
 	domainProject := util.ParseDomainProject(ctx)
-	services, err := findServices(ctx, discovery.MicroServiceToKey(domainProject, provider.Service))
+	services, err := filterServices(ctx, discovery.MicroServiceToKey(domainProject, provider.Service))
 	if err != nil {
 		log.Error(fmt.Sprintf("get instance failed %s", findFlag()), err)
 		return &discovery.GetOneInstanceResponse{
@@ -1752,36 +1606,16 @@ func (ds *DataSource) GetInstances(ctx context.Context, request *discovery.GetIn
 
 // GetProviderInstances returns instances under the specified domain
 func (ds *DataSource) GetProviderInstances(ctx context.Context, request *discovery.GetProviderInstancesRequest) (instances []*discovery.MicroServiceInstance, rev string, err error) {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-	filter := bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}): request.ProviderServiceId}
-
-	findRes, err := client.GetMongoClient().Find(ctx, model.CollectionInstance, filter)
+	filter := mutil.NewBasicFilter(ctx, mutil.InstanceServiceID(request.ProviderServiceId))
+	instances, err = dao.GetMicroServiceInstances(ctx, filter)
 	if err != nil {
 		return
 	}
-
-	for findRes.Next(ctx) {
-		var mongoInstance model.Instance
-		err := findRes.Decode(&mongoInstance)
-		if err == nil {
-			instances = append(instances, mongoInstance.Instance)
-		}
-	}
-
 	return instances, "", nil
 }
 
 func (ds *DataSource) GetAllInstances(ctx context.Context, request *discovery.GetAllInstancesRequest) (*discovery.GetAllInstancesResponse, error) {
-
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-
-	filter := bson.M{model.ColumnDomain: domain, model.ColumnProject: project}
-
+	filter := mutil.NewBasicFilter(ctx)
 	findRes, err := client.GetMongoClient().Find(ctx, model.CollectionInstance, filter)
 	if err != nil {
 		return nil, err
@@ -1808,15 +1642,11 @@ func (ds *DataSource) BatchGetProviderInstances(ctx context.Context, request *di
 	if request == nil || len(request.ServiceIds) == 0 {
 		return nil, "", mutil.ErrInvalidParam
 	}
-
 	domain := util.ParseDomain(ctx)
 	project := util.ParseProject(ctx)
 
 	for _, providerServiceID := range request.ServiceIds {
-		filter := bson.M{
-			model.ColumnDomain:  domain,
-			model.ColumnProject: project,
-			StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}): providerServiceID}
+		filter := mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(providerServiceID))
 		findRes, err := client.GetMongoClient().Find(ctx, model.CollectionInstance, filter)
 		if err != nil {
 			return instances, "", nil
@@ -1864,7 +1694,8 @@ func (ds *DataSource) UpdateInstanceStatus(ctx context.Context, request *discove
 	updateStatusFlag := util.StringJoin([]string{request.ServiceId, request.InstanceId, request.Status}, "/")
 
 	// todo finish get instance
-	instance, err := GetInstance(ctx, request.ServiceId, request.InstanceId)
+	filter := mutil.NewBasicFilter(ctx, mutil.InstanceServiceID(request.ServiceId), mutil.InstanceInstanceID(request.InstanceId))
+	instance, err := dao.GetInstance(ctx, filter)
 	if err != nil {
 		log.Error(fmt.Sprintf("update instance %s status failed", updateStatusFlag), err)
 		return &discovery.UpdateInstanceStatusResponse{
@@ -1880,8 +1711,12 @@ func (ds *DataSource) UpdateInstanceStatus(ctx context.Context, request *discove
 
 	copyInstanceRef := *instance
 	copyInstanceRef.Instance.Status = request.Status
-
-	if err := UpdateInstanceS(ctx, copyInstanceRef.Instance); err != nil {
+	setFilter := mutil.NewFilter(
+		mutil.InstanceModTime(strconv.FormatInt(time.Now().Unix(), baseTen)),
+		mutil.InstanceStatus(copyInstanceRef.Instance.Status),
+	)
+	updateFilter := mutil.NewFilter(mutil.Set(setFilter))
+	if err := dao.UpdateInstance(ctx, filter, updateFilter); err != nil {
 		log.Error(fmt.Sprintf("update instance %s status failed", updateStatusFlag), err)
 		resp := &discovery.UpdateInstanceStatusResponse{
 			Response: discovery.CreateResponseWithSCErr(err),
@@ -1900,8 +1735,10 @@ func (ds *DataSource) UpdateInstanceStatus(ctx context.Context, request *discove
 
 func (ds *DataSource) UpdateInstanceProperties(ctx context.Context, request *discovery.UpdateInstancePropsRequest) (*discovery.UpdateInstancePropsResponse, error) {
 	instanceFlag := util.StringJoin([]string{request.ServiceId, request.InstanceId}, "/")
-
-	instance, err := GetInstance(ctx, request.ServiceId, request.InstanceId)
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
+	filter := mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(request.ServiceId), mutil.InstanceInstanceID(request.InstanceId))
+	instance, err := dao.GetInstance(ctx, filter)
 	if err != nil {
 		log.Error(fmt.Sprintf("update instance %s properties failed", instanceFlag), err)
 		return &discovery.UpdateInstancePropsResponse{
@@ -1919,7 +1756,13 @@ func (ds *DataSource) UpdateInstanceProperties(ctx context.Context, request *dis
 	copyInstanceRef.Instance.Properties = request.Properties
 
 	// todo finish update instance
-	if err := UpdateInstanceP(ctx, copyInstanceRef.Instance); err != nil {
+	filter = mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(request.ServiceId), mutil.InstanceInstanceID(request.InstanceId))
+	setFilter := mutil.NewFilter(
+		mutil.InstanceModTime(strconv.FormatInt(time.Now().Unix(), baseTen)),
+		mutil.InstanceProperties(copyInstanceRef.Instance.Properties),
+	)
+	updateFilter := mutil.NewFilter(mutil.Set(setFilter))
+	if err := dao.UpdateInstance(ctx, filter, updateFilter); err != nil {
 		log.Error(fmt.Sprintf("update instance %s properties failed", instanceFlag), err)
 		resp := &discovery.UpdateInstancePropsResponse{
 			Response: discovery.CreateResponseWithSCErr(err),
@@ -1943,13 +1786,7 @@ func (ds *DataSource) UnregisterInstance(ctx context.Context, request *discovery
 
 	instanceFlag := util.StringJoin([]string{serviceID, instanceID}, "/")
 
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-	filter := bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  serviceID,
-		StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instanceID}
+	filter := mutil.NewBasicFilter(ctx, mutil.InstanceServiceID(serviceID), mutil.InstanceInstanceID(instanceID))
 	result, err := client.GetMongoClient().Delete(ctx, model.CollectionInstance, filter)
 	if err != nil || result.DeletedCount == 0 {
 		log.Error(fmt.Sprintf("unregister instance failed, instance %s, operator %s revoke instance failed", instanceFlag, remoteIP), err)
@@ -2118,7 +1955,7 @@ func (ds *DataSource) findSharedServiceInstance(ctx context.Context, request *di
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 		}, err
 	}
-	services, err := findServices(ctx, provider)
+	services, err := filterServices(ctx, provider)
 	if err != nil {
 		log.Error(fmt.Sprintf("find shared service instance failed %s", findFlag()), err)
 		return &discovery.FindInstancesResponse{
@@ -2133,7 +1970,10 @@ func (ds *DataSource) findSharedServiceInstance(ctx context.Context, request *di
 		}, nil
 	}
 	serviceIDs := filterServiceIDs(ctx, request.ConsumerServiceId, request.Tags, services)
-	instances, err := instancesFilter(ctx, serviceIDs)
+	inFilter := mutil.NewFilter(mutil.In(serviceIDs))
+	filter := mutil.NewFilter(mutil.InstanceServiceID(inFilter))
+	option := &options.FindOptions{Sort: bson.M{mutil.ConnectWithDot([]string{model.ColumnInstance, model.ColumnVersion}): -1}}
+	instances, err := dao.GetMicroServiceInstances(ctx, filter, option)
 	if err != nil {
 		log.Error(fmt.Sprintf("find shared service instance failed %s", findFlag()), err)
 		return &discovery.FindInstancesResponse{
@@ -2157,8 +1997,8 @@ func (ds *DataSource) findInstance(ctx context.Context, request *discovery.FindI
 	domainProject := util.ParseDomainProject(ctx)
 	service := &model.Service{Service: &discovery.MicroService{Environment: request.Environment}}
 	if len(request.ConsumerServiceId) > 0 {
-		filter := GeneratorServiceFilter(ctx, request.ConsumerServiceId)
-		service, err = GetService(ctx, filter)
+		filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(request.ConsumerServiceId))
+		service, err = dao.GetService(ctx, filter)
 		if err != nil {
 			if errors.Is(err, datasource.ErrNoData) {
 				log.Debug(fmt.Sprintf("consumer does not exist, consumer %s find provider %s/%s/%s/%s",
@@ -2194,7 +2034,7 @@ func (ds *DataSource) findInstance(ctx context.Context, request *discovery.FindI
 			Response: discovery.CreateResponse(discovery.ErrInternal, err.Error()),
 		}, err
 	}
-	services, err := findServices(ctx, provider)
+	services, err := filterServices(ctx, provider)
 	if err != nil {
 		log.Error(fmt.Sprintf("find instance failed %s", findFlag()), err)
 		return &discovery.FindInstancesResponse{
@@ -2209,7 +2049,10 @@ func (ds *DataSource) findInstance(ctx context.Context, request *discovery.FindI
 		}, nil
 	}
 	serviceIDs := filterServiceIDs(ctx, request.ConsumerServiceId, request.Tags, services)
-	instances, err := instancesFilter(ctx, serviceIDs)
+	inFilter := mutil.NewFilter(mutil.In(serviceIDs))
+	filter := mutil.NewFilter(mutil.InstanceServiceID(inFilter))
+	option := &options.FindOptions{Sort: bson.M{mutil.ConnectWithDot([]string{model.ColumnInstance, model.ColumnVersion}): -1}}
+	instances, err := dao.GetMicroServiceInstances(ctx, filter, option)
 	if err != nil {
 		log.Error(fmt.Sprintf("find instance failed %s", findFlag()), err)
 		return &discovery.FindInstancesResponse{
@@ -2251,11 +2094,10 @@ func (ds *DataSource) findInstance(ctx context.Context, request *discovery.FindI
 	}, nil
 }
 
-func (ds *DataSource) reshapeProviderKey(ctx context.Context, provider *discovery.MicroServiceKey, providerID string) (
-	*discovery.MicroServiceKey, error) {
+func (ds *DataSource) reshapeProviderKey(ctx context.Context, provider *discovery.MicroServiceKey, providerID string) (*discovery.MicroServiceKey, error) {
 	//维护version的规则,service name 可能是别名,所以重新获取
-	filter := GeneratorServiceFilter(ctx, providerID)
-	providerService, err := GetService(ctx, filter)
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(providerID))
+	providerService, err := dao.GetService(ctx, filter)
 	if err != nil {
 		return nil, err
 	}
@@ -2319,60 +2161,6 @@ func DependencyRuleExistUtil(ctx context.Context, key bson.M, target *discovery.
 	return false, nil
 }
 
-func GetInstance(ctx context.Context, serviceID string, instanceID string) (*model.Instance, error) {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-	filter := bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  serviceID,
-		StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instanceID}
-	findRes, err := client.GetMongoClient().FindOne(ctx, model.CollectionInstance, filter)
-	if err != nil {
-		return nil, err
-	}
-	var instance *model.Instance
-	if findRes.Err() != nil {
-		//not get any service,not db err
-		return nil, nil
-	}
-	err = findRes.Decode(&instance)
-	if err != nil {
-		return nil, err
-	}
-	return instance, nil
-}
-
-func UpdateInstanceS(ctx context.Context, instance *discovery.MicroServiceInstance) *discovery.Error {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-	filter := bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  instance.ServiceId,
-		StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instance.InstanceId}
-	_, err := client.GetMongoClient().Update(ctx, model.CollectionInstance, filter, bson.M{"$set": bson.M{"instance.motTimestamp": strconv.FormatInt(time.Now().Unix(), 10), "instance.status": instance.Status}})
-	if err != nil {
-		return discovery.NewError(discovery.ErrUnavailableBackend, err.Error())
-	}
-	return nil
-}
-
-func UpdateInstanceP(ctx context.Context, instance *discovery.MicroServiceInstance) *discovery.Error {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-	filter := bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}):  instance.ServiceId,
-		StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID}): instance.InstanceId}
-	_, err := client.GetMongoClient().Update(ctx, model.CollectionInstance, filter, bson.M{"$set": bson.M{"instance.motTimestamp": strconv.FormatInt(time.Now().Unix(), 10), "instance.properties": instance.Properties}})
-	if err != nil {
-		return discovery.NewError(discovery.ErrUnavailableBackend, err.Error())
-	}
-	return nil
-}
-
 func KeepAliveLease(ctx context.Context, request *discovery.HeartbeatRequest) *discovery.Error {
 	_, err := heartbeat.Instance().Heartbeat(ctx, request)
 	if err != nil {
@@ -2403,8 +2191,7 @@ func getHeartbeatFunc(ctx context.Context, domainProject string, instancesHbRst
 	}
 }
 
-func (ds *DataSource) batchFindServices(ctx context.Context, request *discovery.BatchFindInstancesRequest) (
-	*discovery.BatchFindResult, error) {
+func (ds *DataSource) batchFindServices(ctx context.Context, request *discovery.BatchFindInstancesRequest) (*discovery.BatchFindResult, error) {
 	if len(request.Services) == 0 {
 		return nil, nil
 	}
@@ -2529,9 +2316,8 @@ func preProcessRegisterInstance(ctx context.Context, instance *discovery.MicroSe
 			instance.HealthCheck.Times = retryTimes
 		}
 	}
-
-	filter := GeneratorServiceFilter(ctx, instance.ServiceId)
-	microservice, err := GetService(ctx, filter)
+	filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(instance.ServiceId))
+	microservice, err := dao.GetService(ctx, filter)
 	if err != nil {
 		return discovery.NewError(discovery.ErrServiceNotExists, "invalid 'serviceID' in request body.")
 	}
@@ -2545,100 +2331,73 @@ func servicesBasicFilter(ctx context.Context, key *discovery.MicroServiceKey) ([
 	if len(tenant) != 2 {
 		return nil, errors.New("invalid 'domain' or 'project'")
 	}
-	filter := bson.M{
-		model.ColumnDomain:  tenant[0],
-		model.ColumnProject: tenant[1],
-		StringBuilder([]string{model.ColumnService, model.ColumnEnv}):         key.Environment,
-		StringBuilder([]string{model.ColumnService, model.ColumnAppID}):       key.AppId,
-		StringBuilder([]string{model.ColumnService, model.ColumnServiceName}): key.ServiceName,
-		StringBuilder([]string{model.ColumnService, model.ColumnAlias}):       key.Alias,
-	}
+	filter := mutil.NewDomainProjectFilter(tenant[0], tenant[1],
+		mutil.ServiceEnv(key.Environment),
+		mutil.ServiceAppID(key.AppId),
+		mutil.ServiceServiceName(key.ServiceName),
+		mutil.ServiceAlias(key.Alias),
+	)
 	rangeIdx := strings.Index(key.Version, "-")
 	// if the version number is clear, need to add the version number to query
 	switch {
 	case key.Version == "latest":
-		return servicesFilter(ctx, filter)
+		return dao.GetServices(ctx, filter)
 	case len(key.Version) > 0 && key.Version[len(key.Version)-1:] == "+":
-		return servicesFilter(ctx, filter)
+		return dao.GetServices(ctx, filter)
 	case rangeIdx > 0:
-		return servicesFilter(ctx, filter)
+		return dao.GetServices(ctx, filter)
 	default:
-		filter[StringBuilder([]string{model.ColumnService, model.ColumnVersion})] = key.Version
-		return servicesFilter(ctx, filter)
+		filter[mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion})] = key.Version
+		return dao.GetServices(ctx, filter)
 	}
 }
 
-func findServices(ctx context.Context, key *discovery.MicroServiceKey) ([]*model.Service, error) {
+func filterServices(ctx context.Context, key *discovery.MicroServiceKey) ([]*model.Service, error) {
 	tenant := strings.Split(key.Tenant, "/")
 	if len(tenant) != 2 {
 		return nil, errors.New("invalid 'domain' or 'project'")
 	}
 	rangeIdx := strings.Index(key.Version, "-")
-	filter := bson.M{
-		model.ColumnDomain:  tenant[0],
-		model.ColumnProject: tenant[1],
-		StringBuilder([]string{model.ColumnService, model.ColumnEnv}):         key.Environment,
-		StringBuilder([]string{model.ColumnService, model.ColumnAppID}):       key.AppId,
-		StringBuilder([]string{model.ColumnService, model.ColumnServiceName}): key.ServiceName,
-		StringBuilder([]string{model.ColumnService, model.ColumnAlias}):       key.Alias,
-	}
+	filter := mutil.NewDomainProjectFilter(tenant[0], tenant[1],
+		mutil.ServiceEnv(key.Environment),
+		mutil.ServiceAppID(key.AppId),
+		mutil.ServiceServiceName(key.ServiceName),
+		mutil.ServiceAlias(key.Alias),
+	)
 	switch {
 	case key.Version == "latest":
-		return latestServicesFilter(ctx, filter)
+		findOption := &options.FindOptions{Sort: bson.M{mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion}): -1}}
+		return dao.GetServices(ctx, filter, findOption)
 	case len(key.Version) > 0 && key.Version[len(key.Version)-1:] == "+":
 		start := key.Version[:len(key.Version)-1]
-		filter[StringBuilder([]string{model.ColumnService, model.ColumnVersion})] = bson.M{"$gte": start}
-		return servicesFilter(ctx, filter)
+		filter[mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion})] = bson.M{"$gte": start}
+		return dao.GetServices(ctx, filter)
 	case rangeIdx > 0:
 		start := key.Version[:rangeIdx]
 		end := key.Version[rangeIdx+1:]
-		filter[StringBuilder([]string{model.ColumnService, model.ColumnVersion})] = bson.M{"$gte": start, "$lte": end}
-		return servicesFilter(ctx, filter)
+		filter[mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion})] = bson.M{"$gte": start, "$lte": end}
+		return dao.GetServices(ctx, filter)
 	default:
-		filter[StringBuilder([]string{model.ColumnService, model.ColumnVersion})] = key.Version
-		return servicesFilter(ctx, filter)
+		filter[mutil.ConnectWithDot([]string{model.ColumnService, model.ColumnVersion})] = key.Version
+		return dao.GetServices(ctx, filter)
 	}
 }
 
-func instancesFilter(ctx context.Context, serviceIDs []string) ([]*discovery.MicroServiceInstance, error) {
-	var instances []*discovery.MicroServiceInstance
-	if len(serviceIDs) == 0 {
-		return instances, nil
-	}
-	resp, err := client.GetMongoClient().Find(ctx, model.CollectionInstance, bson.M{StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}): bson.M{"$in": serviceIDs}}, &options.FindOptions{
-		Sort: bson.M{StringBuilder([]string{model.ColumnInstance, model.ColumnVersion}): -1}})
-	if err != nil {
-		return nil, err
-	}
-	if resp == nil {
-		return nil, errors.New("no related instances were found")
-	}
-	for resp.Next(ctx) {
-		var instance model.Instance
-		err := resp.Decode(&instance)
-		if err != nil {
-			return nil, err
-		}
-		instances = append(instances, instance.Instance)
-	}
-	return instances, nil
-}
-
 func filterServiceIDs(ctx context.Context, consumerID string, tags []string, services []*model.Service) []string {
 	var filterService []*model.Service
-	var serviceIDs []string
+	serviceIDs := make([]string, 0)
 	if len(services) == 0 {
 		return serviceIDs
 	}
-	filterService = tagsFilter(services, tags)
-	filterService = accessibleFilter(ctx, consumerID, filterService)
+	filterService = filterTags(services, tags)
+	filterService = filterAccess(ctx, consumerID, filterService)
 	for _, service := range filterService {
 		serviceIDs = append(serviceIDs, service.Service.ServiceId)
 	}
 	return serviceIDs
 }
 
-func tagsFilter(services []*model.Service, tags []string) []*model.Service {
+func filterTags(services []*model.Service, tags []string) []*model.Service {
 	if len(tags) == 0 {
 		return services
 	}
@@ -2657,8 +2416,8 @@ func tagsFilter(services []*model.Service, tags []string) []*model.Service {
 	return newServices
 }
 
-func accessibleFilter(ctx context.Context, consumerID string, services []*model.Service) []*model.Service {
-	var newServices []*model.Service
+func filterAccess(ctx context.Context, consumerID string, services []*model.Service) []*model.Service {
+	newServices := make([]*model.Service, 0)
 	for _, service := range services {
 		if err := accessible(ctx, consumerID, service.Service.ServiceId); err != nil {
 			findFlag := fmt.Sprintf("consumer '%s' find provider %s/%s/%s", consumerID,
@@ -2671,95 +2430,6 @@ func accessibleFilter(ctx context.Context, consumerID string, services []*model.
 	return newServices
 }
 
-func servicesFilter(ctx context.Context, filter bson.M) ([]*model.Service, error) {
-	resp, err := client.GetMongoClient().Find(ctx, model.CollectionService, filter)
-	if err != nil {
-		return nil, err
-	}
-	if resp == nil {
-		return nil, errors.New("no related services were found")
-	}
-	var services []*model.Service
-	for resp.Next(ctx) {
-		var service model.Service
-		err := resp.Decode(&service)
-		if err != nil {
-			log.Error("type conversion error", err)
-			return nil, err
-		}
-		services = append(services, &service)
-	}
-	return services, nil
-}
-
-func latestServicesFilter(ctx context.Context, filter bson.M) ([]*model.Service, error) {
-	resp, err := client.GetMongoClient().Find(ctx, model.CollectionService, filter, &options.FindOptions{
-		Sort: bson.M{StringBuilder([]string{model.ColumnService, model.ColumnVersion}): -1}})
-	if err != nil {
-		return nil, err
-	}
-	if resp == nil {
-		return nil, errors.New("no related services were found")
-	}
-	var services []*model.Service
-	for resp.Next(ctx) {
-		var service model.Service
-		err := resp.Decode(&service)
-		if err != nil {
-			log.Error("type conversion error", err)
-			return nil, err
-		}
-		services = append(services, &service)
-		if services != nil {
-			return services, nil
-		}
-	}
-	return services, nil
-}
-
-func getTags(ctx context.Context, domain string, project string, serviceID string) (tags map[string]string, err error) {
-	filter := bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnService, model.ColumnServiceID}): serviceID,
-	}
-	result, err := client.GetMongoClient().FindOne(ctx, model.CollectionService, filter)
-	if err != nil {
-		return nil, err
-	}
-	if result.Err() != nil {
-		return nil, result.Err()
-	}
-	var service model.Service
-	err = result.Decode(&service)
-	if err != nil {
-		log.Error("type conversion error", err)
-		return nil, err
-	}
-	return service.Tags, nil
-}
-
-func getService(ctx context.Context, domain string, project string, serviceID string) (*model.Service, error) {
-	filter := bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnService, model.ColumnServiceID}): serviceID,
-	}
-	result, err := client.GetMongoClient().FindOne(ctx, model.CollectionService, filter)
-	if err != nil {
-		return nil, err
-	}
-	if result.Err() != nil {
-		return nil, result.Err()
-	}
-	var svc model.Service
-	err = result.Decode(&svc)
-	if err != nil {
-		return nil, err
-	}
-	return &svc, nil
-}
-
 func accessible(ctx context.Context, consumerID string, providerID string) *discovery.Error {
 	if len(consumerID) == 0 {
 		return nil
@@ -2768,7 +2438,8 @@ func accessible(ctx context.Context, consumerID string, providerID string) *disc
 	consumerDomain, consumerProject := util.ParseDomain(ctx), util.ParseProject(ctx)
 	providerDomain, providerProject := util.ParseTargetDomain(ctx), util.ParseTargetProject(ctx)
 
-	consumerService, err := getService(ctx, consumerDomain, consumerProject, consumerID)
+	filter := mutil.NewDomainProjectFilter(consumerDomain, consumerProject, mutil.ServiceServiceID(consumerID))
+	consumerService, err := dao.GetService(ctx, filter)
 	if err != nil {
 		return discovery.NewError(discovery.ErrInternal, fmt.Sprintf("an error occurred in query consumer(%s)", err.Error()))
 	}
@@ -2776,8 +2447,9 @@ func accessible(ctx context.Context, consumerID string, providerID string) *disc
 		return discovery.NewError(discovery.ErrServiceNotExists, "consumer serviceID is invalid")
 	}
 
+	filter = mutil.NewDomainProjectFilter(providerDomain, providerProject, mutil.ServiceServiceID(providerID))
 	// 跨应用权限
-	providerService, err := getService(ctx, providerDomain, providerProject, providerID)
+	providerService, err := dao.GetService(ctx, filter)
 	if err != nil {
 		return discovery.NewError(discovery.ErrInternal, fmt.Sprintf("an error occurred in query provider(%s)", err.Error()))
 	}
@@ -2790,7 +2462,8 @@ func accessible(ctx context.Context, consumerID string, providerID string) *disc
 	}
 
 	// 黑白名单
-	rules, err := getRulesUtil(ctx, providerDomain, providerProject, providerID)
+	filter = mutil.NewDomainProjectFilter(providerDomain, providerProject, mutil.ServiceID(providerID))
+	rules, err := dao.GetRules(ctx, filter)
 	if err != nil {
 		return discovery.NewError(discovery.ErrInternal, fmt.Sprintf("an error occurred in query provider rules(%s)", err.Error()))
 	}
@@ -2798,12 +2471,7 @@ func accessible(ctx context.Context, consumerID string, providerID string) *disc
 	if len(rules) == 0 {
 		return nil
 	}
-
-	validateTags, err := getTags(ctx, consumerDomain, consumerProject, consumerService.Service.ServiceId)
-	if err != nil {
-		return discovery.NewError(discovery.ErrInternal, fmt.Sprintf("an error occurred in query consumer tags(%s)", err.Error()))
-	}
-	return MatchRules(rules, consumerService.Service, validateTags)
+	return MatchRules(rules, consumerService.Service, consumerService.Tags)
 }
 
 func MatchRules(rulesOfProvider []*model.Rule, consumer *discovery.MicroService, tagsOfConsumer map[string]string) *discovery.Error {
@@ -2885,34 +2553,6 @@ func patternBlackList(rulesOfProvider []*model.Rule, tagsOfConsumer map[string]s
 	}
 	return nil
 }
-
-func getRulesUtil(ctx context.Context, domain string, project string, serviceID string) ([]*model.Rule, error) {
-	filter := bson.M{
-		model.ColumnDomain:    domain,
-		model.ColumnProject:   project,
-		model.ColumnServiceID: serviceID,
-	}
-	cursor, err := client.GetMongoClient().Find(ctx, model.CollectionRule, filter)
-	if err != nil {
-		return nil, err
-	}
-	if cursor.Err() != nil {
-		return nil, cursor.Err()
-	}
-	var rules []*model.Rule
-	defer cursor.Close(ctx)
-	for cursor.Next(ctx) {
-		var rule model.Rule
-		err := cursor.Decode(&rule)
-		if err != nil {
-			log.Error("type conversion error", err)
-			return nil, err
-		}
-		rules = append(rules, &rule)
-	}
-	return rules, nil
-}
-
 func allowAcrossDimension(ctx context.Context, providerService *model.Service, consumerService *model.Service) error {
 	if providerService.Service.AppId != consumerService.Service.AppId {
 		if len(providerService.Service.Properties) == 0 {
@@ -2930,76 +2570,12 @@ func allowAcrossDimension(ctx context.Context, providerService *model.Service, c
 	return nil
 }
 
-func GetInstanceCountOfOneService(ctx context.Context, serviceID string) (int64, error) {
-	filter := GeneratorServiceInstanceFilter(ctx, serviceID)
-	count, err := client.GetMongoClient().Count(ctx, model.CollectionInstance, filter)
-	if err != nil {
-		return 0, nil
-	}
-	return count, nil
-}
-
-func GetAllInstancesOfOneService(ctx context.Context, serviceID string) ([]*discovery.MicroServiceInstance, error) {
-	filter := GeneratorServiceInstanceFilter(ctx, serviceID)
-	res, err := client.GetMongoClient().Find(ctx, model.CollectionInstance, filter)
-	if err != nil {
-		return nil, err
-	}
-	var instances []*discovery.MicroServiceInstance
-	for res.Next(ctx) {
-		var tmp model.Instance
-		err := res.Decode(&tmp)
-		if err != nil {
-			return nil, err
-		}
-		instances = append(instances, tmp.Instance)
-	}
-	return instances, nil
-}
-
-func GetInstances(ctx context.Context, filter bson.M) ([]*model.Instance, error) {
-	res, err := client.GetMongoClient().Find(ctx, model.CollectionInstance, filter)
-	if err != nil {
-		return nil, err
-	}
-	var instances []*model.Instance
-	for res.Next(ctx) {
-		var tmp *model.Instance
-		err := res.Decode(&tmp)
-		if err != nil {
-			return nil, err
-		}
-		instances = append(instances, tmp)
-	}
-	return instances, nil
-}
-
-func GeneratorServiceVersionsFilter(ctx context.Context, service *discovery.MicroServiceKey) bson.M {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-
-	return bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnService, model.ColumnEnv}):         service.Environment,
-		StringBuilder([]string{model.ColumnService, model.ColumnAppID}):       service.AppId,
-		StringBuilder([]string{model.ColumnService, model.ColumnServiceName}): service.ServiceName}
-}
-
-func GeneratorServiceInstanceFilter(ctx context.Context, serviceID string) bson.M {
-	domain := util.ParseDomain(ctx)
-	project := util.ParseProject(ctx)
-	return bson.M{
-		model.ColumnDomain:  domain,
-		model.ColumnProject: project,
-		StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID}): serviceID}
-}
-
 func GetServiceByID(ctx context.Context, serviceID string) (*model.Service, error) {
 	cacheService, ok := sd.Store().Service().Cache().Get(serviceID).(model.Service)
 	if !ok {
 		//no service in cache,get it from mongodb
-		return GetService(ctx, GeneratorServiceFilter(ctx, serviceID))
+		filter := mutil.NewBasicFilter(ctx, mutil.ServiceServiceID(serviceID))
+		return dao.GetService(ctx, filter)
 	}
 	return cacheToService(cacheService), nil
 }
@@ -3026,7 +2602,9 @@ func GetInstancesByServiceID(ctx context.Context, serviceID string) ([]*discover
 		res = append(res, inst.Instance)
 	}
 	if cacheUnavailable || len(res) == 0 {
-		res, err := instancesFilter(ctx, []string{serviceID})
+		filter := mutil.NewFilter(mutil.InstanceServiceID(serviceID))
+		option := &options.FindOptions{Sort: bson.M{mutil.ConnectWithDot([]string{model.ColumnInstance, model.ColumnVersion}): -1}}
+		res, err := dao.GetMicroServiceInstances(ctx, filter, option)
 		if err != nil {
 			return nil, err
 		}
diff --git a/datasource/mongo/ms_test.go b/datasource/mongo/ms_test.go
index 59da2b2..d58bbcc 100644
--- a/datasource/mongo/ms_test.go
+++ b/datasource/mongo/ms_test.go
@@ -31,7 +31,7 @@ import (
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/pkg/log"
 	"github.com/apache/servicecomb-service-center/pkg/util"
 	"github.com/apache/servicecomb-service-center/server/config"
diff --git a/datasource/mongo/role.go b/datasource/mongo/role.go
index b516921..db75c5d 100644
--- a/datasource/mongo/role.go
+++ b/datasource/mongo/role.go
@@ -20,14 +20,14 @@ package mongo
 import (
 	"context"
 
-	"go.mongodb.org/mongo-driver/bson"
+	"github.com/go-chassis/cari/rbac"
 
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/log"
 	"github.com/apache/servicecomb-service-center/pkg/util"
-	"github.com/go-chassis/cari/rbac"
 )
 
 func (ds *DataSource) CreateRole(ctx context.Context, r *rbac.Role) error {
@@ -47,14 +47,12 @@ func (ds *DataSource) CreateRole(ctx context.Context, r *rbac.Role) error {
 		}
 		return err
 	}
-	log.Info("create new role: " + r.ID)
+	log.Info("succeed to create new role: " + r.ID)
 	return nil
 }
 
 func (ds *DataSource) RoleExist(ctx context.Context, name string) (bool, error) {
-	filter := bson.M{
-		model.ColumnRoleName: name,
-	}
+	filter := mutil.NewFilter(mutil.RoleName(name))
 	count, err := client.GetMongoClient().Count(ctx, model.CollectionRole, filter)
 	if err != nil {
 		return false, err
@@ -66,9 +64,7 @@ func (ds *DataSource) RoleExist(ctx context.Context, name string) (bool, error)
 }
 
 func (ds *DataSource) GetRole(ctx context.Context, name string) (*rbac.Role, error) {
-	filter := bson.M{
-		model.ColumnRoleName: name,
-	}
+	filter := mutil.NewFilter(mutil.RoleName(name))
 	result, err := client.GetMongoClient().FindOne(ctx, model.CollectionRole, filter)
 	if err != nil {
 		return nil, err
@@ -79,14 +75,15 @@ func (ds *DataSource) GetRole(ctx context.Context, name string) (*rbac.Role, err
 	var role rbac.Role
 	err = result.Decode(&role)
 	if err != nil {
-		log.Error("Decode role failed: ", err)
+		log.Error("failed to decode role", err)
 		return nil, err
 	}
 	return &role, nil
 }
 
 func (ds *DataSource) ListRole(ctx context.Context) ([]*rbac.Role, int64, error) {
-	cursor, err := client.GetMongoClient().Find(ctx, model.CollectionRole, bson.M{})
+	filter := mutil.NewFilter()
+	cursor, err := client.GetMongoClient().Find(ctx, model.CollectionRole, filter)
 	if err != nil {
 		return nil, 0, err
 	}
@@ -96,7 +93,7 @@ func (ds *DataSource) ListRole(ctx context.Context) ([]*rbac.Role, int64, error)
 		var role rbac.Role
 		err = cursor.Decode(&role)
 		if err != nil {
-			log.Error("decode role failed: ", err)
+			log.Error("failed to decode role", err)
 			continue
 		}
 		roles = append(roles, &role)
@@ -105,9 +102,7 @@ func (ds *DataSource) ListRole(ctx context.Context) ([]*rbac.Role, int64, error)
 }
 
 func (ds *DataSource) DeleteRole(ctx context.Context, name string) (bool, error) {
-	filter := bson.M{
-		model.ColumnRoleName: name,
-	}
+	filter := mutil.NewFilter(mutil.RoleName(name))
 	result, err := client.GetMongoClient().Delete(ctx, model.CollectionRole, filter)
 	if err != nil {
 		return false, err
@@ -119,17 +114,14 @@ func (ds *DataSource) DeleteRole(ctx context.Context, name string) (bool, error)
 }
 
 func (ds *DataSource) UpdateRole(ctx context.Context, name string, role *rbac.Role) error {
-	filter := bson.M{
-		model.ColumnRoleName: name,
-	}
-	update := bson.M{
-		"$set": bson.M{
-			model.ColumnID:       role.ID,
-			model.ColumnRoleName: role.Name,
-			model.ColumnPerms:    role.Perms,
-		},
-	}
-	_, err := client.GetMongoClient().Update(ctx, model.CollectionRole, filter, update)
+	filter := mutil.NewFilter(mutil.RoleName(name))
+	setFilter := mutil.NewFilter(
+		mutil.ID(role.ID),
+		mutil.RoleName(role.Name),
+		mutil.Perms(role.Perms),
+	)
+	updateFilter := mutil.NewFilter(mutil.Set(setFilter))
+	_, err := client.GetMongoClient().Update(ctx, model.CollectionRole, filter, updateFilter)
 	if err != nil {
 		return err
 	}
diff --git a/datasource/mongo/rule_util.go b/datasource/mongo/rule_util.go
index 4fae9ca..e4bd435 100644
--- a/datasource/mongo/rule_util.go
+++ b/datasource/mongo/rule_util.go
@@ -22,7 +22,9 @@ import (
 
 	"github.com/go-chassis/cari/discovery"
 
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/util"
 )
 
@@ -37,8 +39,8 @@ func Filter(ctx context.Context, rules []*model.Rule, consumerID string) (bool,
 	}
 	domain := util.ParseDomainProject(ctx)
 	project := util.ParseProject(ctx)
-
-	tags, err := getTags(ctx, domain, project, consumerID)
+	filter := mutil.NewDomainProjectFilter(domain, project, mutil.ServiceServiceID(consumerID))
+	tags, err := dao.GetTags(ctx, filter)
 	if err != nil {
 		return false, err
 	}
diff --git a/datasource/mongo/rule_util_test.go b/datasource/mongo/rule_util_test.go
index 86d4ffa..f0e5bd4 100644
--- a/datasource/mongo/rule_util_test.go
+++ b/datasource/mongo/rule_util_test.go
@@ -26,7 +26,7 @@ import (
 
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 )
 
 func TestRuleFilter_Filter(t *testing.T) {
diff --git a/datasource/mongo/sd/listwatch_inner.go b/datasource/mongo/sd/listwatch_inner.go
index 2ee4d35..da673c4 100644
--- a/datasource/mongo/sd/listwatch_inner.go
+++ b/datasource/mongo/sd/listwatch_inner.go
@@ -26,7 +26,7 @@ import (
 	"go.mongodb.org/mongo-driver/mongo/options"
 
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/sdcommon"
 	"github.com/apache/servicecomb-service-center/pkg/log"
 	"github.com/apache/servicecomb-service-center/pkg/util"
diff --git a/datasource/mongo/sd/listwatch_test.go b/datasource/mongo/sd/listwatch_test.go
index 8f2d8c2..f4e8232 100644
--- a/datasource/mongo/sd/listwatch_test.go
+++ b/datasource/mongo/sd/listwatch_test.go
@@ -26,7 +26,7 @@ import (
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/bson/primitive"
 
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/sdcommon"
 )
 
diff --git a/datasource/mongo/sd/mongo_cacher.go b/datasource/mongo/sd/mongo_cacher.go
index 0686fc1..0faeeac 100644
--- a/datasource/mongo/sd/mongo_cacher.go
+++ b/datasource/mongo/sd/mongo_cacher.go
@@ -26,7 +26,7 @@ import (
 
 	rmodel "github.com/go-chassis/cari/discovery"
 
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/sdcommon"
 	"github.com/apache/servicecomb-service-center/pkg/backoff"
 	"github.com/apache/servicecomb-service-center/pkg/gopool"
diff --git a/datasource/mongo/sd/mongo_cacher_test.go b/datasource/mongo/sd/mongo_cacher_test.go
index 8e6cfd0..6fc9870 100644
--- a/datasource/mongo/sd/mongo_cacher_test.go
+++ b/datasource/mongo/sd/mongo_cacher_test.go
@@ -26,7 +26,7 @@ import (
 	"github.com/stretchr/testify/assert"
 	"go.mongodb.org/mongo-driver/bson"
 
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/sdcommon"
 	"github.com/apache/servicecomb-service-center/pkg/gopool"
 )
diff --git a/datasource/mongo/system.go b/datasource/mongo/system.go
index 9ad647b..e7725c0 100644
--- a/datasource/mongo/system.go
+++ b/datasource/mongo/system.go
@@ -23,7 +23,7 @@ import (
 	"github.com/patrickmn/go-cache"
 
 	"github.com/apache/servicecomb-service-center/datasource"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/sd"
 	"github.com/apache/servicecomb-service-center/pkg/dump"
 	"github.com/apache/servicecomb-service-center/pkg/gopool"
diff --git a/datasource/mongo/system_test.go b/datasource/mongo/system_test.go
index e38b181..1ac7853 100644
--- a/datasource/mongo/system_test.go
+++ b/datasource/mongo/system_test.go
@@ -26,7 +26,7 @@ import (
 
 	"github.com/apache/servicecomb-service-center/datasource"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/client"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
 	"github.com/apache/servicecomb-service-center/datasource/mongo/sd"
 )
 
diff --git a/datasource/mongo/util.go b/datasource/mongo/util.go
index a886599..d0954e1 100644
--- a/datasource/mongo/util.go
+++ b/datasource/mongo/util.go
@@ -19,14 +19,16 @@ package mongo
 
 import (
 	"context"
-	"strings"
+
+	pb "github.com/go-chassis/cari/discovery"
+	"go.mongodb.org/mongo-driver/bson"
 
 	"github.com/apache/servicecomb-service-center/datasource"
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/dao"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	mutil "github.com/apache/servicecomb-service-center/datasource/mongo/util"
 	"github.com/apache/servicecomb-service-center/pkg/gopool"
 	"github.com/apache/servicecomb-service-center/pkg/util"
-	pb "github.com/go-chassis/cari/discovery"
-	"go.mongodb.org/mongo-driver/bson"
 )
 
 type InstanceSlice []*pb.MicroServiceInstance
@@ -43,18 +45,6 @@ func (s InstanceSlice) Less(i, j int) bool {
 	return s[i].InstanceId < s[j].InstanceId
 }
 
-func StringBuilder(data []string) string {
-	var str strings.Builder
-	for index, value := range data {
-		if index == 0 {
-			str.WriteString(value)
-		} else {
-			str.WriteString("." + value)
-		}
-	}
-	return str.String()
-}
-
 func statistics(ctx context.Context, withShared bool) (*pb.Statistics, error) {
 	result := &pb.Statistics{
 		Services:  &pb.StService{},
@@ -66,7 +56,7 @@ func statistics(ctx context.Context, withShared bool) (*pb.Statistics, error) {
 
 	filter := bson.M{model.ColumnDomain: domain, model.ColumnProject: project}
 
-	services, err := GetServices(ctx, filter)
+	services, err := dao.GetMicroServices(ctx, filter)
 	if err != nil {
 		return nil, err
 	}
@@ -84,7 +74,7 @@ func statistics(ctx context.Context, withShared bool) (*pb.Statistics, error) {
 		getInstanceCountByDomain(ctx, svcIDToNonVerKey, respGetInstanceCountByDomain)
 	})
 
-	instances, err := GetInstances(ctx, filter)
+	instances, err := dao.GetInstances(ctx, filter)
 	if err != nil {
 		return nil, err
 	}
@@ -104,8 +94,11 @@ func statistics(ctx context.Context, withShared bool) (*pb.Statistics, error) {
 
 func getInstanceCountByDomain(ctx context.Context, svcIDToNonVerKey map[string]string, resp chan datasource.GetInstanceCountByDomainResponse) {
 	ret := datasource.GetInstanceCountByDomainResponse{}
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
 	for _, sid := range svcIDToNonVerKey {
-		num, err := GetInstanceCountOfOneService(ctx, sid)
+		filter := mutil.NewDomainProjectFilter(domain, project, mutil.InstanceServiceID(sid))
+		num, err := dao.CountInstance(ctx, filter)
 		if err != nil {
 			ret.Err = err
 			return
diff --git a/datasource/mongo/util/db.go b/datasource/mongo/util/db.go
index 9c5f437..7c97c0e 100644
--- a/datasource/mongo/util/db.go
+++ b/datasource/mongo/util/db.go
@@ -18,11 +18,15 @@
 package util
 
 import (
+	"context"
+
+	"github.com/go-chassis/cari/rbac"
 	"go.mongodb.org/mongo-driver/bson"
 	"go.mongodb.org/mongo-driver/mongo"
 	"go.mongodb.org/mongo-driver/x/bsonx"
 
-	"github.com/apache/servicecomb-service-center/datasource/mongo/model"
+	"github.com/apache/servicecomb-service-center/datasource/mongo/client/model"
+	"github.com/apache/servicecomb-service-center/pkg/util"
 )
 
 type Option func(filter bson.M)
@@ -39,6 +43,72 @@ func Project(project string) Option {
 	}
 }
 
+func AccountName(name interface{}) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnAccountName] = name
+	}
+}
+
+func Password(password string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnPassword] = password
+	}
+}
+
+func Roles(roles []string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnRoles] = roles
+	}
+}
+
+func TokenExpirationTime(tokenExpirationTime string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnTokenExpirationTime] = tokenExpirationTime
+	}
+}
+
+func CurrentPassword(password string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnCurrentPassword] = password
+	}
+}
+
+func Status(status string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnStatus] = status
+	}
+}
+
+func ID(id string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnID] = id
+	}
+}
+
+func RoleName(name string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnRoleName] = name
+	}
+}
+
+func Perms(perms []*rbac.Permission) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnPerms] = perms
+	}
+}
+
+func In(data interface{}) Option {
+	return func(filter bson.M) {
+		filter["$in"] = data
+	}
+}
+
+func Set(data interface{}) Option {
+	return func(filter bson.M) {
+		filter["$set"] = data
+	}
+}
+
 func NewFilter(options ...func(filter bson.M)) bson.M {
 	filter := bson.M{}
 	for _, option := range options {
@@ -47,15 +117,214 @@ func NewFilter(options ...func(filter bson.M)) bson.M {
 	return filter
 }
 
-func InstanceServiceID(serviceID string) Option {
+func NewDomainProjectFilter(domain string, project string, options ...func(filter bson.M)) bson.M {
+	filter := bson.M{
+		model.ColumnDomain:  domain,
+		model.ColumnProject: project,
+	}
+	for _, option := range options {
+		option(filter)
+	}
+	return filter
+}
+
+func NewBasicFilter(ctx context.Context, options ...func(filter bson.M)) bson.M {
+	domain := util.ParseDomain(ctx)
+	project := util.ParseProject(ctx)
+
+	filter := bson.M{
+		model.ColumnDomain:  domain,
+		model.ColumnProject: project,
+	}
+	for _, option := range options {
+		option(filter)
+	}
+	return filter
+}
+
+func InstanceServiceID(serviceID interface{}) Option {
 	return func(filter bson.M) {
-		filter[StringBuilder([]string{model.ColumnInstance, model.ColumnServiceID})] = serviceID
+		filter[ConnectWithDot([]string{model.ColumnInstance, model.ColumnServiceID})] = serviceID
 	}
 }
 
 func InstanceInstanceID(instanceID string) Option {
 	return func(filter bson.M) {
-		filter[StringBuilder([]string{model.ColumnInstance, model.ColumnInstanceID})] = instanceID
+		filter[ConnectWithDot([]string{model.ColumnInstance, model.ColumnInstanceID})] = instanceID
+	}
+}
+
+func ServiceServiceID(serviceID string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnService, model.ColumnServiceID})] = serviceID
+	}
+}
+
+func ServiceEnv(env string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnService, model.ColumnEnv})] = env
+	}
+}
+
+func ServiceAppID(appID string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnService, model.ColumnAppID})] = appID
+	}
+}
+
+func ServiceModTime(modTime string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnService, model.ColumnModTime})] = modTime
+	}
+}
+
+func ServiceProperty(property map[string]string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnService, model.ColumnProperty})] = property
+	}
+}
+
+func ServiceServiceName(serviceName string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnService, model.ColumnServiceName})] = serviceName
+	}
+}
+
+func ServiceID(serviceID string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnServiceID] = serviceID
+	}
+}
+
+func ServiceAlias(alias string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnService, model.ColumnAlias})] = alias
+	}
+}
+
+func ServiceSchemas(schemas []string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnService, model.ColumnSchemas})] = schemas
+	}
+}
+
+func ServiceVersion(version interface{}) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnService, model.ColumnVersion})] = version
+	}
+}
+
+func ServiceType(serviceType string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnServiceType] = serviceType
+	}
+}
+
+func ServiceKeyTenant(tenant string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnServiceKey, model.ColumnTenant})] = tenant
+	}
+}
+
+func ServiceKeyAppID(appID string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnServiceKey, model.ColumnAppID})] = appID
+	}
+}
+
+func ServiceKeyServiceName(serviceName string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnServiceKey, model.ColumnServiceName})] = serviceName
+	}
+}
+
+func ServiceKeyServiceEnv(env string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnServiceKey, model.ColumnEnv})] = env
+	}
+}
+
+func ServiceKeyServiceVersion(version string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnServiceKey, model.ColumnVersion})] = version
+	}
+}
+
+func Schema(schema string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnSchema] = schema
+	}
+}
+
+func SchemaID(schemaID string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnSchemaID] = schemaID
+	}
+}
+
+func RuleAttribute(attribute string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnAttribute})] = attribute
+	}
+}
+
+func RuleRuleID(ruleID string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnRuleID})] = ruleID
+	}
+}
+
+func RuleRuleType(ruleType string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnRuleType})] = ruleType
+	}
+}
+
+func RulePattern(pattern string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnPattern})] = pattern
+	}
+}
+
+func RuleDescription(description string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnDescription})] = description
+	}
+}
+
+func RuleModTime(modTime string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnRule, model.ColumnModTime})] = modTime
+	}
+}
+
+func SchemaSummary(schemaSummary string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnSchemaSummary] = schemaSummary
+	}
+}
+
+func Tags(tags map[string]string) Option {
+	return func(filter bson.M) {
+		filter[model.ColumnTag] = tags
+	}
+}
+
+func InstanceModTime(modTime string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnService, model.ColumnModTime})] = modTime
+	}
+}
+
+func InstanceStatus(status string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnInstance, model.ColumnStatus})] = status
+	}
+}
+
+func InstanceProperties(properties map[string]string) Option {
+	return func(filter bson.M) {
+		filter[ConnectWithDot([]string{model.ColumnInstance, model.ColumnProperty})] = properties
 	}
 }
 
diff --git a/datasource/mongo/util/string.go b/datasource/mongo/util/string.go
index aadad1b..1aadd1e 100644
--- a/datasource/mongo/util/string.go
+++ b/datasource/mongo/util/string.go
@@ -19,7 +19,7 @@ package util
 
 import "strings"
 
-func StringBuilder(data []string) string {
+func ConnectWithDot(data []string) string {
 	var str strings.Builder
 	for index, value := range data {
 		if index == 0 {