gpt4 book ai didi

go - mgo 不保证不同的指数

转载 作者:IT王子 更新时间:2023-10-29 02:06:00 26 4
gpt4 key购买 nike

我使用以下 go 文件作为我的 http API 和 mgo 之间的层:

package store

import (
"reflect"
"strings"

"labix.org/v2/mgo"
"labix.org/v2/mgo/bson"
)

type Manager struct {
collection *mgo.Collection
}

type Model interface {
Id() bson.ObjectId
}

func (m *Manager) index(model Model) {
v := reflect.ValueOf(model).Elem()

var index, unique []string

for i := 0; i < v.NumField(); i++ {
t := v.Type().Field(i)

if s := t.Tag.Get("store"); len(s) != 0 {
if strings.Contains(s, "index") {
index = append(index, t.Name)
}
if strings.Contains(s, "unique") {
unique = append(unique, t.Name)
}
}
}

m.collection.EnsureIndex(mgo.Index{Key: index})
m.collection.EnsureIndex(mgo.Index{Key: unique, Unique: true})
}

func (m *Manager) Create(model Model) error {
m.index(model)

return m.collection.Insert(model)
}

func (m *Manager) Update(model Model) error {
m.index(model)

return m.collection.UpdateId(model.Id(), model)
}

func (m *Manager) Destroy(model Model) error {
m.index(model)

return m.collection.RemoveId(model.Id())
}

func (m *Manager) Find(query Query, models interface{}) error {
return m.collection.Find(query).All(models)
}

func (m *Manager) FindOne(query Query, model Model) error {
m.index(model)

return m.collection.Find(query).One(model)
}

如您所见,我通过调用 m.index(model) 来确保每个操作的索引。模型类型具有 store:"index"store:"unique" 形式的标签。

由于设置通用索引与设置唯一索引不同,我分别收集它们,然后在解析的键上调用 m.collection.EnsureIndex

然而,对 m.collection.EnsureIndex 的第二次调用从未到达服务器,仅发送了正常索引。

查看 godocs显示确保 Index 缓存其调用,因此我认为我应该将它们组合在一个调用中。

那么如何在对 EnsureIndex 的一次调用中组合不同的索引设置?

解决方案:您需要将 reflect 中的小写字段名称与 mgo 一起使用...

最佳答案

问题描述似乎暗示您在同一组字段上有唯一和非唯一索引。这是一种额外的不必要开销。在这些情况下,只需创建一个唯一索引即可。

关于go - mgo 不保证不同的指数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24584501/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com