为了账号安全,请及时绑定邮箱和手机立即绑定

mgo, mongodb:找到一个嵌入的文档并且是数组的一部分

mgo, mongodb:找到一个嵌入的文档并且是数组的一部分

Go
叮当猫咪 2021-07-26 16:44:44
2 部分问题。1是mongodb查询本身,接下来是在mgo中怎么做。如何查询 1 个类别类型的文档(结果应该是类别类型),其中slug: "general"?我选择这种布局的原因是因为我读到 mongodb 的优势是嵌入“结构”的性能但是我担心我必须让“类别”和“论坛”成为自己的集合并重写大量代码,我想避免这是因为客户端的每个视图无论如何都需要访问这些模型,这将导致每个新页面加载(对于类别和论坛)的 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"                }            ]        }    ]}
查看完整描述

2 回答

?
拉莫斯之舞

TA贡献1820条经验 获得超10个赞

虽然(如上所述)这有效:

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

但我认为这将查询集合中的所有文档,然后选择正确的文档。因此我认为下面的解决方案更有效。

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



查看完整回答
反对 回复 2021-08-02
  • 2 回答
  • 0 关注
  • 226 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信