improvement: remove useless label collection (#136)

diff --git a/deployments/db.js b/deployments/db.js
index 9f11118..d150b41 100644
--- a/deployments/db.js
+++ b/deployments/db.js
@@ -32,7 +32,7 @@
 db.createCollection( "kv", {
     validator: { $jsonSchema: {
             bsonType: "object",
-            required: [ "key","domain","project","id","value","create_revision","update_revision","value_type","label_id" ],
+            required: [ "key","domain","project","id","value","create_revision","update_revision","value_type","label_format" ],
             properties: {
                 key: {
                     bsonType: "string",
@@ -56,26 +56,6 @@
         } }
 } );
 db.createCollection("kv_revision");
-db.createCollection( "label", {
-    validator: { $jsonSchema: {
-            bsonType: "object",
-            required: [ "id","domain","project","format" ],
-            properties: {
-                label_id: {
-                    bsonType: "string",
-                },
-                domain: {
-                    bsonType: "string"
-                },
-                project: {
-                    bsonType: "string"
-                },
-                alias: {
-                    bsonType: "string"
-                }
-            }
-        } }
-} );
 db.createCollection( "view", {
     validator: { $jsonSchema: {
             bsonType: "object",
@@ -134,7 +114,7 @@
 
 //index
 db.kv.createIndex({"id": 1}, { unique: true } );
-db.kv.createIndex({key: 1, label_id: 1,domain:1,project:1},{ unique: true });
+db.kv.createIndex({key: 1, label_format: 1,domain:1,project:1},{ unique: true });
 db.kv_revision.createIndex( { "delete_time": 1 }, { expireAfterSeconds: 7 * 24 * 3600 } );
 db.label.createIndex({"id": 1}, { unique: true } );
 db.label.createIndex({format: 1,domain:1,project:1},{ unique: true });
diff --git a/docs/getstarted/verify.md b/docs/getstarted/verify.md
index 44a5efc..1801cf6 100644
--- a/docs/getstarted/verify.md
+++ b/docs/getstarted/verify.md
@@ -15,7 +15,6 @@
 ```json
 {
  "id": "05529229-efc3-49ca-a765-05759b23ab28",
- "label_id": "e7faac8e-053e-4906-99ab-989f61febe74",
  "key": "ingressRule",
  "value": "some rule",
  "value_type": "text",
diff --git a/docs/intro/concepts.md b/docs/intro/concepts.md
index 7f391fe..480867b 100644
--- a/docs/intro/concepts.md
+++ b/docs/intro/concepts.md
@@ -20,7 +20,6 @@
 ```json
 {
  "id": "05529229-efc3-49ca-a765-05759b23ab28",
- "label_id": "e7faac8e-053e-4906-99ab-989f61febe74",
  "key": "enable_a_function",
  "value": "true",
  "value_type": "text",
diff --git a/pkg/model/db_schema.go b/pkg/model/db_schema.go
index d28a191..f44b646 100644
--- a/pkg/model/db_schema.go
+++ b/pkg/model/db_schema.go
@@ -30,7 +30,7 @@
 //KVDoc is database struct to store kv
 type KVDoc struct {
 	ID             string `json:"id,omitempty" bson:"id,omitempty" yaml:"id,omitempty" swag:"string"`
-	LabelID        string `json:"label_id,omitempty" bson:"label_id,omitempty" yaml:"label_id,omitempty"`
+	LabelFormat    string `json:"label_format,omitempty" bson:"label_format,omitempty" yaml:"label_format,omitempty"`
 	Key            string `json:"key" yaml:"key" validate:"commonName"`
 	Value          string `json:"value" yaml:"value" validate:"ascii,min=1,max=2097152"`
 	ValueType      string `json:"value_type,omitempty" bson:"value_type,omitempty" yaml:"value_type,omitempty" validate:"valueType"` //ini,json,text,yaml,properties
diff --git a/pkg/model/kv.go b/pkg/model/kv.go
index 5d87baa..79d5a55 100644
--- a/pkg/model/kv.go
+++ b/pkg/model/kv.go
@@ -35,13 +35,11 @@
 
 //LabelDocResponse is label struct
 type LabelDocResponse struct {
-	LabelID string            `json:"label_id,omitempty"`
-	Labels  map[string]string `json:"labels,omitempty"`
+	Labels map[string]string `json:"labels,omitempty"`
 }
 
 //LabelHistoryResponse is label history revision struct
 type LabelHistoryResponse struct {
-	LabelID  string            `json:"label_id,omitempty"  bson:"label_id,omitempty"`
 	Labels   map[string]string `json:"labels,omitempty"`
 	KVs      []*KVDoc          `json:"data,omitempty"`
 	Revision int               `json:"revision"`
@@ -59,7 +57,7 @@
 	CreateTime     string            `json:"create_time"`
 	ID             string            `json:"id"`
 	Key            string            `json:"key"`
-	LabelID        string            `json:"label_id"`
+	LabelFormat    string            `json:"label_format"`
 	Labels         map[string]string `json:"labels"`
 	UpdateRevision int64             `json:"update_revision"`
 	UpdateTime     string            `json:"update_time"`
diff --git a/server/resource/v1/history_resource_test.go b/server/resource/v1/history_resource_test.go
index 84e84a8..44becb8 100644
--- a/server/resource/v1/history_resource_test.go
+++ b/server/resource/v1/history_resource_test.go
@@ -47,7 +47,7 @@
 		Domain:  "default",
 		Project: "history_test",
 	}
-	kv, _ = service.KVService.CreateOrUpdate(context.Background(), kv)
+	kv, _ = service.KVService.Create(context.Background(), kv)
 	path := fmt.Sprintf("/v1/history_test/kie/revision/%s", kv.ID)
 	r, _ := http.NewRequest("GET", path, nil)
 	revision := &v1.HistoryResource{}
@@ -67,7 +67,7 @@
 	t.Run("put again, should has 2 revision", func(t *testing.T) {
 		kv.Domain = "default"
 		kv.Project = "history_test"
-		kv, err = service.KVService.CreateOrUpdate(context.Background(), kv)
+		kv, err = service.KVService.Update(context.Background(), kv)
 		assert.NoError(t, err)
 		path := fmt.Sprintf("/v1/history_test/kie/revision/%s", kv.ID)
 		r, _ := http.NewRequest("GET", path, nil)
diff --git a/server/resource/v1/label_resouce.go b/server/resource/v1/label_resouce.go
deleted file mode 100644
index 23905bf..0000000
--- a/server/resource/v1/label_resouce.go
+++ /dev/null
@@ -1,82 +0,0 @@
-package v1
-
-import (
-	"fmt"
-	"net/http"
-
-	"github.com/apache/servicecomb-kie/pkg/common"
-	"github.com/apache/servicecomb-kie/pkg/model"
-	"github.com/apache/servicecomb-kie/server/service"
-	goRestful "github.com/emicklei/go-restful"
-	"github.com/go-chassis/go-chassis/server/restful"
-	"github.com/go-mesh/openlogging"
-)
-
-//LabelResource is label API
-type LabelResource struct {
-}
-
-//PutLabel update by label_id , only can modify alias
-// create return 201 / update return 200
-func (r *LabelResource) PutLabel(context *restful.Context) {
-	var err error
-	entity := new(model.LabelDoc)
-	if err = readRequest(context, entity); err != nil {
-		WriteErrResponse(context, http.StatusBadRequest, fmt.Sprintf(FmtReadRequestError, err))
-		return
-	}
-	entity.Project = context.ReadPathParameter("project")
-	domain := ReadDomain(context)
-	if domain == nil {
-		WriteErrResponse(context, http.StatusInternalServerError, common.MsgDomainMustNotBeEmpty)
-		return
-	}
-	entity.Domain = domain.(string)
-	res, err := service.LabelService.CreateOrUpdate(context.Ctx, entity)
-	if err != nil {
-		if err == service.ErrRevisionNotExist {
-			WriteErrResponse(context, http.StatusNotFound, err.Error())
-			return
-		}
-		WriteErrResponse(context, http.StatusInternalServerError, err.Error())
-		return
-	}
-	if res == nil {
-		WriteErrResponse(context, http.StatusNotFound, "put alias fail")
-		return
-	}
-	if entity.ID == "" {
-		context.WriteHeader(http.StatusCreated)
-	}
-	err = writeResponse(context, res)
-	if err != nil {
-		openlogging.Error(err.Error())
-	}
-}
-
-//URLPatterns defined config operations
-func (r *LabelResource) URLPatterns() []restful.Route {
-	return []restful.Route{
-		{
-			Method:       http.MethodPut,
-			Path:         "/v1/{project}/kie/label",
-			ResourceFunc: r.PutLabel,
-			FuncDesc:     "put alias for label or create new label",
-			Parameters: []*restful.Parameters{
-				DocPathProject, DocPathKeyID,
-			},
-			Returns: []*restful.Returns{
-				{
-					Code:    http.StatusOK,
-					Message: "update success",
-				},
-				{
-					Code:    http.StatusCreated,
-					Message: "create success",
-				},
-			},
-			Consumes: []string{goRestful.MIME_JSON, common.ContentTypeYaml},
-			Produces: []string{goRestful.MIME_JSON, common.ContentTypeYaml},
-		},
-	}
-}
diff --git a/server/resource/v1/label_resouce_test.go b/server/resource/v1/label_resouce_test.go
deleted file mode 100644
index 411197d..0000000
--- a/server/resource/v1/label_resouce_test.go
+++ /dev/null
@@ -1,75 +0,0 @@
-package v1_test
-
-import (
-	"bytes"
-	"context"
-	"encoding/json"
-	"github.com/apache/servicecomb-kie/pkg/model"
-	handler2 "github.com/apache/servicecomb-kie/server/handler"
-	v1 "github.com/apache/servicecomb-kie/server/resource/v1"
-	"github.com/apache/servicecomb-kie/server/service"
-	"github.com/go-chassis/go-chassis/core/common"
-	"github.com/go-chassis/go-chassis/core/handler"
-	"github.com/go-chassis/go-chassis/server/restful/restfultest"
-	"github.com/stretchr/testify/assert"
-	"io/ioutil"
-	"net/http"
-	"net/http/httptest"
-	"testing"
-)
-
-func TestLabelResource_PutLabel(t *testing.T) {
-	t.Run("update label alias", func(t *testing.T) {
-		kv := &model.KVDoc{
-			Key:   "test",
-			Value: "revisions",
-			Labels: map[string]string{
-				"test": "revisions",
-			},
-			Domain:  "default",
-			Project: "label_test",
-		}
-		kv, _ = service.KVService.CreateOrUpdate(context.Background(), kv)
-		j := []byte("{\"alias\":\"test\",\"id\":\"" + kv.LabelID + "\"}")
-		r, _ := http.NewRequest("PUT", "/v1/label_test/kie/label", bytes.NewBuffer(j))
-		r.Header.Add("Content-Type", "application/json")
-		revision := &v1.LabelResource{}
-		noopH := &handler2.NoopAuthHandler{}
-		chain, _ := handler.CreateChain(common.Provider, "testchain2", noopH.Name())
-		c, err := restfultest.New(revision, chain)
-		assert.NoError(t, err)
-		resp := httptest.NewRecorder()
-		c.ServeHTTP(resp, r)
-		body, err := ioutil.ReadAll(resp.Body)
-		assert.NoError(t, err)
-		data := &model.LabelDoc{}
-		err = json.Unmarshal(body, &data)
-		assert.NoError(t, err)
-		assert.Equal(t, data.Alias, "test")
-	})
-	t.Run("put label", func(t *testing.T) {
-		label := &model.LabelDoc{
-			Labels: map[string]string{
-				"test": "revisions",
-			},
-			Domain:  "default",
-			Project: "label_test",
-		}
-		j, _ := json.Marshal(label)
-		r, _ := http.NewRequest("PUT", "/v1/label_test/kie/label", bytes.NewBuffer(j))
-		r.Header.Add("Content-Type", "application/json")
-		revision := &v1.LabelResource{}
-		noopH := &handler2.NoopAuthHandler{}
-		chain, _ := handler.CreateChain(common.Provider, "testchain2", noopH.Name())
-		c, err := restfultest.New(revision, chain)
-		assert.NoError(t, err)
-		resp := httptest.NewRecorder()
-		c.ServeHTTP(resp, r)
-		body, err := ioutil.ReadAll(resp.Body)
-		assert.NoError(t, err)
-		data := &model.LabelDoc{}
-		err = json.Unmarshal(body, &data)
-		assert.NoError(t, err)
-		//	assert.NotEmpty(t, data.ID)
-	})
-}
diff --git a/server/service/mongo/history/service_test.go b/server/service/mongo/history/service_test.go
index ea0aa77..24af89d 100644
--- a/server/service/mongo/history/service_test.go
+++ b/server/service/mongo/history/service_test.go
@@ -37,8 +37,8 @@
 	cur, err := coll.Find(
 		context.Background(),
 		bson.M{
-			"label_id": "5dbc079183ff1a09242376e7",
-			"data.key": "lb",
+			"label_format": "5dbc079183ff1a09242376e7",
+			"data.key":     "lb",
 		})
 	assert.NoError(t, err)
 	for cur.Next(ctx) {
diff --git a/server/service/mongo/init.go b/server/service/mongo/init.go
index 8f57b60..0b81c09 100644
--- a/server/service/mongo/init.go
+++ b/server/service/mongo/init.go
@@ -22,7 +22,6 @@
 	"github.com/apache/servicecomb-kie/server/service/mongo/counter"
 	"github.com/apache/servicecomb-kie/server/service/mongo/history"
 	"github.com/apache/servicecomb-kie/server/service/mongo/kv"
-	"github.com/apache/servicecomb-kie/server/service/mongo/label"
 	"github.com/apache/servicecomb-kie/server/service/mongo/session"
 	"github.com/go-mesh/openlogging"
 )
@@ -33,5 +32,4 @@
 	service.KVService = &kv.Service{}
 	service.HistoryService = &history.Service{}
 	service.RevisionService = &counter.Service{}
-	service.LabelService = &label.Service{}
 }
diff --git a/server/service/mongo/kv/kv_dao.go b/server/service/mongo/kv/kv_dao.go
index a776d0c..1c4f90f 100644
--- a/server/service/mongo/kv/kv_dao.go
+++ b/server/service/mongo/kv/kv_dao.go
@@ -80,7 +80,7 @@
 		return err
 	}
 	collection := session.GetDB().Collection(session.CollectionKV)
-	ur, err := collection.UpdateOne(ctx, bson.M{"key": kv.Key, "label_id": kv.LabelID}, bson.D{
+	ur, err := collection.UpdateOne(ctx, bson.M{"key": kv.Key, "label_format": kv.LabelFormat}, bson.D{
 		{"$set", bson.D{
 			{"value", kv.Value},
 			{"status", kv.Status},
@@ -263,11 +263,11 @@
 	return kvs, nil
 }
 
-//findKVByLabelID get kvs by key and label id
+//findKVByLabel get kvs by key and label
 //key can be empty, then it will return all key values
 //if key is given, will return 0-1 key value
-func findKVByLabelID(ctx context.Context, domain, labelID, key string, project string) ([]*model.KVDoc, error) {
-	filter := bson.M{"label_id": labelID, "domain": domain, "project": project}
+func findKVByLabel(ctx context.Context, domain, labelFormat, key string, project string) ([]*model.KVDoc, error) {
+	filter := bson.M{"label_format": labelFormat, "domain": domain, "project": project}
 	if key != "" {
 		filter["key"] = key
 		return findOneKey(ctx, filter)
diff --git a/server/service/mongo/kv/kv_service.go b/server/service/mongo/kv/kv_service.go
index 1a2526f..3d121ee 100644
--- a/server/service/mongo/kv/kv_service.go
+++ b/server/service/mongo/kv/kv_service.go
@@ -19,12 +19,12 @@
 
 import (
 	"context"
+	"github.com/apache/servicecomb-kie/pkg/stringutil"
 	"time"
 
 	"github.com/apache/servicecomb-kie/pkg/model"
 	"github.com/apache/servicecomb-kie/pkg/util"
 	"github.com/apache/servicecomb-kie/server/service"
-	"github.com/apache/servicecomb-kie/server/service/mongo/label"
 	"github.com/apache/servicecomb-kie/server/service/mongo/session"
 	"github.com/go-mesh/openlogging"
 )
@@ -49,32 +49,11 @@
 		kv.Labels = map[string]string{}
 	}
 	//check whether the project has certain labels or not
-	labelID, err := label.Exist(ctx, kv.Domain, kv.Project, kv.Labels)
-	if err != nil {
-		if err == session.ErrLabelNotExists {
-			l := &model.LabelDoc{
-				Domain:  kv.Domain,
-				Labels:  kv.Labels,
-				Project: kv.Project,
-			}
-			l, err = label.CreateLabel(ctx, l)
-			if err != nil {
-				openlogging.Error(MsgCreateLabelFailed, openlogging.WithTags(openlogging.Tags{
-					"k":      kv.Key,
-					"domain": kv.Domain,
-				}))
-				return nil, err
-			}
-			labelID = l.ID
-		} else {
-			return nil, err
-		}
-	}
-	kv.LabelID = labelID
+	kv.LabelFormat = stringutil.FormatMap(kv.Labels)
 	if kv.ValueType == "" {
 		kv.ValueType = session.DefaultValueType
 	}
-	_, err = s.Exist(ctx, kv.Domain, kv.Key, kv.Project, service.WithLabelID(kv.LabelID))
+	_, err := s.Exist(ctx, kv.Domain, kv.Key, kv.Project, service.WithLabelFormat(kv.LabelFormat))
 	if err == nil {
 		return nil, session.ErrKVAlreadyExists
 	}
@@ -109,69 +88,6 @@
 
 }
 
-//CreateOrUpdate will create or update a key value record
-//it first check label exists or not, and create labels if labels is first posted.
-//if label exists, then get its latest revision, and update current revision,
-//save the current label and its all key values to history collection
-//then check key exists or not, then create or update it
-func (s *Service) CreateOrUpdate(ctx context.Context, kv *model.KVDoc) (*model.KVDoc, error) {
-	ctx, _ = context.WithTimeout(ctx, session.Timeout)
-	if kv.Domain == "" {
-		return nil, session.ErrMissingDomain
-	}
-	//check whether the project has certain labels or not
-	labelID, err := label.Exist(ctx, kv.Domain, kv.Project, kv.Labels)
-	if err != nil {
-		if err == session.ErrLabelNotExists {
-			l := &model.LabelDoc{
-				Domain:  kv.Domain,
-				Labels:  kv.Labels,
-				Project: kv.Project,
-			}
-			l, err = label.CreateLabel(ctx, l)
-			if err != nil {
-				openlogging.Error(MsgCreateLabelFailed, openlogging.WithTags(openlogging.Tags{
-					"k":      kv.Key,
-					"domain": kv.Domain,
-				}))
-				return nil, err
-			}
-			labelID = l.ID
-		} else {
-			return nil, err
-		}
-	}
-	kv.LabelID = labelID
-	if kv.ValueType == "" {
-		kv.ValueType = session.DefaultValueType
-	}
-	oldKV, err := s.Exist(ctx, kv.Domain, kv.Key, kv.Project, service.WithLabelID(kv.LabelID))
-	if err != nil {
-		if err != service.ErrKeyNotExists {
-			openlogging.Error(err.Error())
-			return nil, err
-		}
-		kv, err := createKey(ctx, kv)
-		if err != nil {
-			openlogging.Error(err.Error())
-			return nil, err
-		}
-		kv.Domain = ""
-		kv.Project = ""
-		return kv, nil
-	}
-	kv.ID = oldKV.ID
-	kv.CreateRevision = oldKV.CreateRevision
-	err = updateKeyValue(ctx, kv)
-	if err != nil {
-		return nil, err
-	}
-	kv.Domain = ""
-	kv.Project = ""
-	return kv, nil
-
-}
-
 //Exist supports you query a key value by label map or labels id
 func (s *Service) Exist(ctx context.Context, domain, key string, project string, options ...service.FindOption) (*model.KVDoc, error) {
 	ctx, _ = context.WithTimeout(context.Background(), session.Timeout)
@@ -179,8 +95,8 @@
 	for _, o := range options {
 		o(&opts)
 	}
-	if opts.LabelID != "" {
-		kvs, err := findKVByLabelID(ctx, domain, opts.LabelID, key, project)
+	if opts.LabelFormat != "" {
+		kvs, err := findKVByLabel(ctx, domain, opts.LabelFormat, key, project)
 		if err != nil {
 			if err != service.ErrKeyNotExists {
 				openlogging.Error(err.Error())
diff --git a/server/service/mongo/kv/kv_test.go b/server/service/mongo/kv/kv_service_test.go
similarity index 89%
rename from server/service/mongo/kv/kv_test.go
rename to server/service/mongo/kv/kv_service_test.go
index 7283ce3..9f8de37 100644
--- a/server/service/mongo/kv/kv_test.go
+++ b/server/service/mongo/kv/kv_service_test.go
@@ -24,12 +24,24 @@
 	"github.com/apache/servicecomb-kie/server/service"
 	"github.com/apache/servicecomb-kie/server/service/mongo/kv"
 	"github.com/apache/servicecomb-kie/server/service/mongo/session"
+	log "github.com/go-chassis/paas-lager"
+	"github.com/go-mesh/openlogging"
 	"github.com/stretchr/testify/assert"
 	"testing"
 )
 
 var id string
 
+func init() {
+	log.Init(log.Config{
+		Writers:     []string{"stdout"},
+		LoggerLevel: "DEBUG",
+	})
+
+	logger := log.NewLogger("ut")
+	openlogging.SetLogger(logger)
+}
+
 func TestService_CreateOrUpdate(t *testing.T) {
 	var err error
 	config.Configurations = &config.Config{DB: config.DB{URI: "mongodb://kie:123@127.0.0.1:27017/kie"}}
@@ -37,7 +49,7 @@
 	assert.NoError(t, err)
 	kvsvc := &kv.Service{}
 	t.Run("put kv timeout,with labels app and service", func(t *testing.T) {
-		kv, err := kvsvc.CreateOrUpdate(context.TODO(), &model.KVDoc{
+		kv, err := kvsvc.Create(context.TODO(), &model.KVDoc{
 			Key:   "timeout",
 			Value: "2s",
 			Labels: map[string]string{
@@ -51,7 +63,7 @@
 		assert.NotEmpty(t, kv.ID)
 	})
 	t.Run("put kv timeout,with labels app, service and version", func(t *testing.T) {
-		kv, err := kvsvc.CreateOrUpdate(context.TODO(), &model.KVDoc{
+		kv, err := kvsvc.Create(context.TODO(), &model.KVDoc{
 			Key:   "timeout",
 			Value: "2s",
 			Labels: map[string]string{
@@ -73,7 +85,7 @@
 		assert.NotEmpty(t, oid)
 	})
 	t.Run("put kv timeout,with labels app,and update value", func(t *testing.T) {
-		_, err := kvsvc.CreateOrUpdate(context.Background(), &model.KVDoc{
+		beforeKV, err := kvsvc.Create(context.Background(), &model.KVDoc{
 			Key:   "timeout",
 			Value: "1s",
 			Labels: map[string]string{
@@ -83,7 +95,8 @@
 			Project: "kv-test",
 		})
 		assert.NoError(t, err)
-		afterKV, err := kvsvc.CreateOrUpdate(context.Background(), &model.KVDoc{
+		afterKV, err := kvsvc.Update(context.Background(), &model.KVDoc{
+			ID:    beforeKV.ID,
 			Key:   "timeout",
 			Value: "3s",
 			Labels: map[string]string{
diff --git a/server/service/mongo/kv/kv_suite_test.go b/server/service/mongo/kv/kv_suite_test.go
deleted file mode 100644
index e744c46..0000000
--- a/server/service/mongo/kv/kv_suite_test.go
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * 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 kv_test
-
-import (
-	"github.com/go-chassis/paas-lager"
-	"github.com/go-mesh/openlogging"
-)
-
-func init() {
-
-	log.Init(log.Config{
-		Writers:     []string{"stdout"},
-		LoggerLevel: "DEBUG",
-	})
-
-	logger := log.NewLogger("ut")
-	openlogging.SetLogger(logger)
-}
diff --git a/server/service/mongo/kv/tool.go b/server/service/mongo/kv/tool.go
index 776eea6..01957c3 100644
--- a/server/service/mongo/kv/tool.go
+++ b/server/service/mongo/kv/tool.go
@@ -25,4 +25,5 @@
 func clearPart(kv *model.KVDoc) {
 	kv.Domain = ""
 	kv.Project = ""
+	kv.LabelFormat = ""
 }
diff --git a/server/service/mongo/label/label_dao.go b/server/service/mongo/label/label_dao.go
deleted file mode 100644
index eff2821..0000000
--- a/server/service/mongo/label/label_dao.go
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * 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 label
-
-import (
-	"context"
-	"fmt"
-
-	"github.com/apache/servicecomb-kie/pkg/model"
-	"github.com/apache/servicecomb-kie/pkg/stringutil"
-	"github.com/apache/servicecomb-kie/server/service"
-	"github.com/apache/servicecomb-kie/server/service/mongo/session"
-	"github.com/go-mesh/openlogging"
-	uuid "github.com/satori/go.uuid"
-	"go.mongodb.org/mongo-driver/bson"
-	"go.mongodb.org/mongo-driver/bson/primitive"
-)
-
-//const of label dao
-const (
-	defaultLabels     = "default"
-	MsgHitExactLabels = "hit exact labels"
-)
-
-//FindLabels find label doc by labels and project, check if the project has certain labels
-//if map is empty. will return default labels doc which has no labels
-func FindLabels(ctx context.Context, domain, project string, labels map[string]string) (*model.LabelDoc, error) {
-	collection := session.GetDB().Collection(session.CollectionLabel)
-	filter := bson.M{"domain": domain, "project": project}
-	filter["format"] = stringutil.FormatMap(labels) //allow key without labels
-	cur, err := collection.Find(ctx, filter)
-	if err != nil {
-		return nil, err
-	}
-	defer cur.Close(ctx)
-	if cur.Err() != nil {
-		return nil, err
-	}
-	openlogging.Debug(fmt.Sprintf("find labels [%s] in [%s]", labels, domain))
-	curLabel := &model.LabelDoc{} //reuse this pointer to reduce GC, only clear label
-	//check label length to get the exact match
-	for cur.Next(ctx) { //although complexity is O(n), but there won't be so much labels
-		curLabel.Labels = nil
-		err := cur.Decode(curLabel)
-		if err != nil {
-			openlogging.Error("decode error: " + err.Error())
-			return nil, err
-		}
-		if len(curLabel.Labels) == len(labels) {
-			openlogging.Debug(MsgHitExactLabels)
-			curLabel.Labels = nil //exact match don't need to return labels
-			return curLabel, nil
-		}
-
-	}
-	return nil, session.ErrLabelNotExists
-}
-
-//Exist check whether the project has certain label or not and return label ID
-func Exist(ctx context.Context, domain string, project string, labels map[string]string) (string, error) {
-	l, err := FindLabels(ctx, domain, project, labels)
-	if err != nil {
-		if err.Error() == context.DeadlineExceeded.Error() {
-			openlogging.Error("find label failed, dead line exceeded", openlogging.WithTags(openlogging.Tags{
-				"timeout": session.Timeout,
-			}))
-			return "", fmt.Errorf("operation timout %s", session.Timeout)
-		}
-		return "", err
-	}
-
-	return l.ID, nil
-
-}
-
-//CreateLabel create a new label
-func CreateLabel(ctx context.Context, label *model.LabelDoc) (*model.LabelDoc, error) {
-	label.ID = uuid.NewV4().String()
-	label.Format = stringutil.FormatMap(label.Labels)
-	collection := session.GetDB().Collection(session.CollectionLabel)
-	_, err := collection.InsertOne(ctx, label)
-	if err != nil {
-		return nil, err
-	}
-	return label, nil
-}
-
-//UpdateLabel update alias
-func UpdateLabel(ctx context.Context, label *model.LabelDoc) (*model.LabelDoc, error) {
-	collection := session.GetDB().Collection(session.CollectionLabel)
-	queryFilter := bson.M{"id": label.ID}
-	if label.Alias == "" {
-		return nil, service.ErrAliasNotGiven
-	}
-	updateFilter := bson.D{primitive.E{Key: "$set", Value: bson.M{"alias": label.Alias}}}
-	cur := collection.FindOneAndUpdate(ctx, queryFilter, updateFilter)
-	if cur.Err() != nil {
-		return nil, cur.Err()
-	}
-	return label, nil
-}
diff --git a/server/service/mongo/label/label_dao_test.go b/server/service/mongo/label/label_dao_test.go
deleted file mode 100644
index 8ca80d2..0000000
--- a/server/service/mongo/label/label_dao_test.go
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * 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 label_test
-
-import (
-	"context"
-	"github.com/apache/servicecomb-kie/pkg/model"
-	"github.com/apache/servicecomb-kie/server/config"
-	"github.com/apache/servicecomb-kie/server/service/mongo/label"
-	"github.com/apache/servicecomb-kie/server/service/mongo/session"
-	"github.com/stretchr/testify/assert"
-	"testing"
-)
-
-func TestCreateLabel(t *testing.T) {
-	var err error
-	config.Configurations = &config.Config{DB: config.DB{URI: "mongodb://kie:123@127.0.0.1:27017/kie"}}
-	err = session.Init()
-	assert.NoError(t, err)
-	d := &model.LabelDoc{
-		Domain: "default",
-		Labels: map[string]string{
-			"cluster":   "a",
-			"role":      "b",
-			"component": "c",
-		},
-		Project: "default",
-	}
-	d, err = label.CreateLabel(context.TODO(), d)
-	assert.NoError(t, err)
-	assert.NotEmpty(t, d.ID)
-	assert.Equal(t, "cluster=a::component=c::role=b", d.Format)
-	t.Log(d)
-
-	id, err := label.Exist(context.TODO(), "default", "default", map[string]string{
-		"cluster":   "a",
-		"role":      "b",
-		"component": "c",
-	})
-	assert.NoError(t, err)
-	assert.NotEmpty(t, id)
-}
diff --git a/server/service/mongo/label/label_service.go b/server/service/mongo/label/label_service.go
deleted file mode 100644
index 5b0d934..0000000
--- a/server/service/mongo/label/label_service.go
+++ /dev/null
@@ -1,18 +0,0 @@
-package label
-
-import (
-	"context"
-	"github.com/apache/servicecomb-kie/pkg/model"
-)
-
-//Service is db service
-type Service struct {
-}
-
-//CreateOrUpdate create or update labels
-func (s *Service) CreateOrUpdate(ctx context.Context, label *model.LabelDoc) (*model.LabelDoc, error) {
-	if label.ID != "" {
-		return UpdateLabel(ctx, label)
-	}
-	return CreateLabel(ctx, label)
-}
diff --git a/server/service/mongo/session/session.go b/server/service/mongo/session/session.go
index 0446c30..ab9db6e 100644
--- a/server/service/mongo/session/session.go
+++ b/server/service/mongo/session/session.go
@@ -61,11 +61,10 @@
 	ErrTooMany         = errors.New("key with labels should be only one")
 	ErrKeyMustNotEmpty = errors.New("must supply key if you want to get exact one result")
 
-	ErrIDIsNil                = errors.New("id is empty")
-	ErrKeyIsNil               = errors.New("key must not be empty")
-	ErrKvIDAndLabelIDNotMatch = errors.New("kvID and labelID do not match")
-	ErrRootCAMissing          = errors.New("rootCAFile is empty in config file")
-	ErrKVAlreadyExists        = errors.New("kv already exists")
+	ErrIDIsNil         = errors.New("id is empty")
+	ErrKeyIsNil        = errors.New("key must not be empty")
+	ErrRootCAMissing   = errors.New("rootCAFile is empty in config file")
+	ErrKVAlreadyExists = errors.New("kv already exists")
 
 	ErrViewCreation = errors.New("can not create view")
 	ErrViewUpdate   = errors.New("can not update view")
@@ -223,7 +222,7 @@
 		panic(err)
 	}
 	err = c.EnsureIndex(mgo.Index{
-		Key:    []string{"key", "label_id", "domain", "project"},
+		Key:    []string{"key", "label_format", "domain", "project"},
 		Unique: true,
 	})
 	if err != nil {
@@ -238,28 +237,6 @@
 	if err != nil {
 		panic(err)
 	}
-	//label
-	c = session.DB(DBName).C(CollectionLabel)
-	err = c.Create(&mgo.CollectionInfo{Validator: bson.M{
-		"id":      bson.M{"$exists": true},
-		"domain":  bson.M{"$exists": true},
-		"project": bson.M{"$exists": true},
-		"format":  bson.M{"$exists": true},
-	}})
-	err = c.EnsureIndex(mgo.Index{
-		Key:    []string{"id"},
-		Unique: true,
-	})
-	if err != nil {
-		panic(err)
-	}
-	err = c.EnsureIndex(mgo.Index{
-		Key:    []string{"format", "domain", "project"},
-		Unique: true,
-	})
-	if err != nil {
-		panic(err)
-	}
 	//view
 	c = session.DB(DBName).C(CollectionView)
 	err = c.Create(&mgo.CollectionInfo{Validator: bson.M{
diff --git a/server/service/mongo/view/view_service_test.go b/server/service/mongo/view/view_service_test.go
index 1f1f19e..c43fce0 100644
--- a/server/service/mongo/view/view_service_test.go
+++ b/server/service/mongo/view/view_service_test.go
@@ -39,7 +39,7 @@
 	assert.NoError(t, err)
 	kvsvc := &kv.Service{}
 	t.Run("put view data", func(t *testing.T) {
-		kv, err := kvsvc.CreateOrUpdate(context.TODO(), &model.KVDoc{
+		kv, err := kvsvc.Create(context.TODO(), &model.KVDoc{
 			Key:   "timeout",
 			Value: "2s",
 			Labels: map[string]string{
@@ -53,7 +53,7 @@
 		assert.NoError(t, err)
 		assert.NotEmpty(t, kv.ID)
 
-		kv, err = kvsvc.CreateOrUpdate(context.TODO(), &model.KVDoc{
+		kv, err = kvsvc.Create(context.TODO(), &model.KVDoc{
 			Key:   "timeout",
 			Value: "2s",
 			Labels: map[string]string{
@@ -65,7 +65,7 @@
 		assert.NoError(t, err)
 		assert.NotEmpty(t, kv.ID)
 
-		kv, err = kvsvc.CreateOrUpdate(context.TODO(), &model.KVDoc{
+		kv, err = kvsvc.Create(context.TODO(), &model.KVDoc{
 			Key:   "retry",
 			Value: "2",
 			Labels: map[string]string{
diff --git a/server/service/options.go b/server/service/options.go
index 55c2e53..1293691 100644
--- a/server/service/options.go
+++ b/server/service/options.go
@@ -37,7 +37,7 @@
 	ID          string
 	Key         string
 	Labels      map[string]string
-	LabelID     string
+	LabelFormat string
 	ClearLabel  bool
 	Timeout     time.Duration
 	Offset      int64
@@ -89,10 +89,10 @@
 	}
 }
 
-//WithLabelID find kv by labelID
-func WithLabelID(label string) FindOption {
+//WithLabelFormat find kv by label string
+func WithLabelFormat(label string) FindOption {
 	return func(o *FindOptions) {
-		o.LabelID = label
+		o.LabelFormat = label
 	}
 }
 
diff --git a/server/service/service.go b/server/service/service.go
index e899468..51552f3 100644
--- a/server/service/service.go
+++ b/server/service/service.go
@@ -28,7 +28,6 @@
 	KVService       KV
 	HistoryService  History
 	RevisionService Revision
-	LabelService    Label
 	DBInit          Init
 )
 
@@ -45,7 +44,6 @@
 	//below 3 methods is usually for admin console
 	Create(ctx context.Context, kv *model.KVDoc) (*model.KVDoc, error)
 	Update(ctx context.Context, kv *model.KVDoc) (*model.KVDoc, error)
-	CreateOrUpdate(ctx context.Context, kv *model.KVDoc) (*model.KVDoc, error)
 	List(ctx context.Context, domain, project string, options ...FindOption) (*model.KVResponse, error)
 	//FindOneAndDelete deletes one kv by id and return the deleted kv as these appeared before deletion
 	FindOneAndDelete(ctx context.Context, kvID string, domain, project string) (*model.KVDoc, error)
@@ -67,11 +65,6 @@
 	GetRevision(ctx context.Context, domain string) (int64, error)
 }
 
-//Label manages labels data
-type Label interface {
-	CreateOrUpdate(ctx context.Context, label *model.LabelDoc) (*model.LabelDoc, error)
-}
-
 //View create update and get view data
 type View interface {
 	Create(ctx context.Context, viewDoc *model.ViewDoc, options ...FindOption) error