gpt4 book ai didi

mongodb - mgo,mongodb : find one document that is embedded and part of an array

转载 作者:IT老高 更新时间:2023-10-28 13:34:00 24 4
gpt4 key购买 nike

问题的 2 个部分。

1是mongodb查询本身,接下来是mgo中怎么做。

如何查询slug: "general"的1个category类型的文档(结果应该是category类型)?

我选择这个布局的原因是因为我读到了 mongodb 的优势是嵌入式“结构”的性能但是我担心我必须让“类别”和“论坛”成为自己的集合并重写很多代码,我会希望避免这种情况,因为客户端的每个 View 无论如何都需要访问这些模型,并且在每个新页面加载(类别和论坛)上都会导致 1-2 个额外的查询,并且使用 mongodb 的优势将消失。

接下来的问题是,我将如何更新或删除一个特定的嵌入文档?

有没有一种方法可以直接从 mongodb 获取类别文档,而无需分离文档或在 Go 中编写 find、update、delete 函数,以及如何?

这个结构:

{
"_id" : ObjectId("5303d1a2d6194c0f27000001"),
"name" : "darko",
"description" : "darko",
"subdomain" : "darko",
"domain" : "mango.dev",
"created" : ISODate("2014-02-18T21:33:22.115Z"),
"category" : "Brains",
"owner" : "52b1d74dd6194c0646000002",
"members" : [
"52b1d74dd6194c0646000002"
],
"categories" : [
{
"_id" : ObjectId("5303d1a2d6194c0f27000003"),
"name" : "Admin and Moderator Area",
"slug" : "admin-and-moderator-area",
"adminonly" : true,
"membersonly" : false,
"forums" : [
{
"_id" : ObjectId("5303d1a2d6194c0f27000005"),
"name" : "Admin Discussion",
"slug" : "admin-discussion",
"text" : "This is the main forum for administrative topics."
}
]
},
{
"_id" : ObjectId("5303d1a2d6194c0f27000002"),
"name" : "General",
"slug" : "general",
"adminonly" : false,
"membersonly" : false,
"forums" : [
{
"_id" : ObjectId("5303d1a2d6194c0f27000004"),
"name" : "General Discussion",
"slug" : "general-discussion",
"text" : "Talk about everything and anything here in this general discussion forum"
}
]
}
]
}

或继续:

Community struct {
Id bson.ObjectId `bson:"_id,omitempty" json:"id"`
Name string `json:"name"`
Description string `bson:",omitempty" json:"description"`
Subdomain string `bson:",omitempty" json:"subdomain"`
Domain string `json:"domain"`
Created time.Time `json:"created"`
Category string `json:"category"`
Owner interface{} `json:"owner"` //userid
Members []interface{} `json:"members"` //userid
Moderators []interface{} `bson:",omitempty" json:"moderators"` //userid
Logo string `bson:",omitempty" json:"logo"` // relative path to file
Stylesheets []string `bson:",omitempty" json:"stylesheets"` // absolute path to files
Javascripts []string `bson:",omitempty" json:"javascripts"` // absolute path to files
Categories []*Category `json:"categories"`
}

Category struct {
Id bson.ObjectId `bson:"_id,omitempty" json:"id"`
Name string `json:"name"`
Slug string `json:"slug"`
AdminOnly bool `json:"-"`
MembersOnly bool `json:"-"`
Forums []*Forum `json:"forums"`
}

Forum struct {
Id bson.ObjectId `bson:"_id,omitempty" json:"id"`
Name string `json:"name"`
Slug string `json:"slug"`
Text string `json:"text"`
Moderators []interface{} `bson:",omitempty" json:"moderators"` //userid
}

最佳答案

1.

目前,MongoDB 没有内置方法返回子文档,您只能返回文档的投影。话虽如此,您仍然可以使用投影找到您要查找的数据。

MongoDB manual给你一个非常相似的例子。您应该进行的查询是:

db.coll.find({}, {categories:{ $elemMatch: {"slug":"general"}}})

2.

使用 mgo,投影部分使用 Select 处理。 mgo documentation状态:

func (q *Query) Select(selector interface{}) *Query

Select enables selecting which fields should be retrieved for the results found.

没试过,应该是这样的:

err := collection.Find(nil).Select(bson.M{"categories": bson.M{"$elemMatch": bson.M{"slug": "general"}}}).One(&result)

为了得到嵌套的 Category 对象,你可以让 result 成为一个包含结构:

type CategoryContainer struct {
Categories []Category{} // Or even [1]Category{} in this case
}

然后简单地获取类别:

category := result.Categories[0]

3.

关于更新子文档,已经有很好的帖子了,比如:

MongoDB: Updating subdocument

关于mongodb - mgo,mongodb : find one document that is embedded and part of an array,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22507446/

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