英文:
Select one document with array with limited number of elements
问题
我有以下 Room 类型的结构:
type Room struct {
Id bson.ObjectId `json:"id" bson:"_id,omitempty"`
Title string `json:"title" bson:"title"`
Description string `json:"description" bson:"description,omitempty"`
Type string `json:"type" bson:"type,omitempty"`
AdminId bson.ObjectId `json:"admin_id" bson:"admin_id"`
CreatedOn time.Time `json:"created_on" bson:"created_on"`
Messages []Message `json:"messages" bson:"messages,omitempty"`
}
类型结构 Message 是嵌套的,具有以下结构:
type Message struct {
Id bson.ObjectId `json:"id" bson:"_id,omitempty"`
Text string `json:"text" bson:"text"`
Author Author `json:"author" bson:"author"`
CreatedOn time.Time `json:"createdon" bson:"created_on"`
Reply []Message `json:"reply" bson:"reply,omitempty"`
}
使用这段代码,我可以提取集合的所有字段。
room := &Room{}
roomsCollection := session.DB(config.Data.DB.Database).C("Rooms")
err := roomsCollection.Find(bson.M{"_id": room_id}).One(room)
if err != nil {
panic(err)
return nil, err
}
这将返回给定文档中所有带有消息的房间。问题是,我可以限制每个文档中嵌套的 Messages
数组的长度吗?
英文:
I have the following structure of the Room type:
type Room struct {
Id bson.ObjectId `json:"id" bson:"_id,omitempty"`
Title string `json:"title" bson:"title"`
Description string `json:"description" bson:"description,omitempty"`
Type string `json:"type" bson:"type,omitempty"`
AdminId bson.ObjectId `json:"admin_id" bson:"admin_id"`
CreatedOn time.Time `json:"created_on" bson:"created_on"`
Messages []Message `json:"messages" bson:"messages,omitempty"`}
The type struct Message is embedded, which has the following structure
type Message struct {
Id bson.ObjectId `json:"id" bson:"_id,omitempty"`
Text string `json:"text" bson:"text"`
Author Author `json:"author" bson:"author"`
CreatedOn time.Time `json:"createdon" bson:"created_on"`
Reply []Message `json:"reply" bson:"reply,omitempty"`}
Using this code I can extract all the fields of the collection.
room := &Room{}
roomsCollection := session.DB(config.Data.DB.Database).C("Rooms")
err := roomsCollection.Find(bson.M{"_id": room_id}).One(room)
if err != nil {
panic(err)
return nil, err
}
This gives the rooms with all the messages in the given documents.
The question is, can I limit the length of nested Messages
array in each document?
答案1
得分: 2
所以,解决方案非常简单。我们可以使用$slice来执行此操作。结果查询如下所示:
roomsCollection.Find(bson.M{"_id": room_id})).Select(bson.M{"messages": bson.M{"$slice": 5}}).One(room)
特别感谢@Veeram提供的正确答案。
英文:
So, the solution was really simple. To perform this we can use $slice.
The result query will be as following:
roomsCollection.Find(bson.M{"_id": room_id})).Select(bson.M{ "messages": bson.M{ "$slice": 5} } ).One(room)
Special thanks to @Veeram for correct answer.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论