Создание уникального поля в Mongo-go-driver - PullRequest
1 голос
/ 30 апреля 2019

Я очень плохо знаком с Go и Mongodb и писал свои первые rest-api с Go и Mongo.Я использую mongo-go-driver и имею следующую Modal структуру в Go

type Modal struct {
    Group     []string           `bson:"group" json:"group"`
    Hostname  string             `bson:"hostname" json:"hostname"`
    Overrides map[string]string  `bson:"overrides" json:"overrides"`
    Excludes  []string           `bson:"excludes" json:"excludes"`
}

Я не хочу использовать поле по умолчанию ObjectId, предоставляемое mongo-db, в качестве моего первичного ключа и вместо этого хотел бысделать поле Hostname первичным ключом.

Если я сделаю тип поля Hostname равным primitive.ObjectID, тогда hostname будет уникальным, но его значение будет случайным образом сгенерированоmongodb, а не фактическое значение строки имени хоста.

Так есть ли способ, которым я могу это сделать.

1 Ответ

1 голос
/ 30 апреля 2019

Вы можете использовать уникальный индекс для принудительного применения / разрешения только определенных значений данного поля, например ::

db.collectionname.createIndex( { "hostname": 1 }, { unique: true } )

Если вы хотите создать такой индекс, используя официальный драйвер MongoDB, вот как вы можете это сделать:

indexName, err := coll.Indexes().CreateOne(
    context.Background(),
    IndexModel{
        Keys   : bsonx.Doc{{"hostname", bsonx.Int32(1)}},
        Options: options.Index().SetUnique(true),
    },
)

Но знайте, что в MongoDB каждый документ должен иметь свойство _id, поэтому, как указано выше, документы будут иметь автоматически сгенерированное поле _id (типа ObjectId). Если вас это не беспокоит, все готово.

Также обратите внимание, что вы можете сопоставить Modal.Hostname с полем _id с тегами структуры:

type Modal struct {
    Group     []string           `bson:"group" json:"group"`
    Hostname  string             `bson:"_id" json:"hostname"`
    Overrides map[string]string  `bson:"overrides" json:"overrides"`
    Excludes  []string           `bson:"excludes" json:"excludes"`
}

И снова все готово. Недостатком этого решения является то, что документы в MongoDB не будут иметь свойства с именем hostname, поскольку оно будет храниться в _id.

...