gpt4 book ai didi

mongodb - 使用 Mgo 创建自定义 ID

转载 作者:IT王子 更新时间:2023-10-29 00:45:32 24 4
gpt4 key购买 nike

我目前正从 GoLang 和 MongoDB 着手。我正在编写一个小型网络应用程序,更具体地说是一个博客(这就像我尝试新语言时编写的第一个网络应用程序)。即使一开始我遇到了一些麻烦,MGO 也一切正常。但现在我想分别访问每个博客条目(文章将被称为条目以坚持我的模型)。我可以在 url 中使用 ObjectID。但这太他妈丑了。例如:
mydomain.com/entries/543fd8940e82533995000002/
那不是用户友好的。我在 Internet 上进行了大量研究以找到合适的解决方案,因为使用任何其他数据库引擎我都可以只使用 id(这很好)。

有人可以帮我创建一个自定义(公共(public))id,当我插入一个新条目时它会自动递增并且我可以在 url 中使用它吗?

这是我现在模型的代码:

package models

import (
"time"

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

type (
Entries []Entry
Entry struct {
ID bson.ObjectId `bson:"_id,omitempty"`
Title string `bson:"title"`
Short string `bson:"short"`
Content string `bson:"content"`
Posted time.Time `bson:"posted"`
}
)

// Insert an entry to the database
func InsertEntry(database *mgo.Database, entry *Entry) error {
entry.ID = bson.NewObjectId()
return database.C("entries").Insert(entry)
}

// Find an entry by id
func GetEntryByID(database *mgo.Database, id string) (entry Entry, err error) {
bid := bson.ObjectIdHex(id)
err = database.C("entries").FindId(bid).One(&entry)
return
}

// Retrieves all the entries
func AllEntries(database *mgo.Database) (entries Entries, err error) {
err = database.C("entries").Find(nil).All(&entries)
return
}

// Retrieve all the entries sorted by date.
func AllEntriesByDate(database *mgo.Database) (entries Entries, err error) {
err = database.C("entries").Find(nil).Sort("-posted").All(&entries)
return
}

// Counts all the entries.
func CountAllEntries(database *mgo.Database) (count int, err error) {
count, err = database.C("entries").Find(nil).Count()
return
}

最佳答案

如您所知,_id 是必填字段,当您未设置它时,它会由驱动程序自动填充。这是您当前应用程序/代码中的行为。您可以在此处找到有关此类型及其生成的信息:http://docs.mongodb.org/manual/reference/object-id/

但是,您可以创建自己的 _id 并将值设置为对您的业务有意义的任何值。

这就是为什么我不明白下面的说法:

I did a lot of research on the internet to find a suitable solution, because using any other database engine I could just use the id (and that would be fine).

您可以使用您想要的任何值,只要它对您的收藏是唯一的。

关于自增,MongoDB没有提供自增字段,需要自己实现,在应用中调用自增。

例如,您创建了一个包含“序列/计数器”的新集合:(显示 shell 命令未执行)

{
_id : "entry",
sequence : 0
}

然后当你想要一个新的文档 ID 时,你必须首先更新,使用简单的 $inc 操作查找和修改你创建的文档

var ret = db.counters.findAndModify(
{
query: { _id: "entry" },
update: { $inc: { seq: 1 } },
new: true
}
);

然后您可以将返回值用作新文档中的 _id。

此模式记录在此处: http://docs.mongodb.org/manual/tutorial/create-an-auto-incrementing-field/

关于mongodb - 使用 Mgo 创建自定义 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26546412/

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