gpt4 book ai didi

go - 查询具有不同结构的文档以获得结果

转载 作者:IT王子 更新时间:2023-10-29 01:46:01 25 4
gpt4 key购买 nike

我有一组文档被插入到 Mongo 中,看起来像这样:

type Stats struct {
UserStatus string `json:"userStatus" bson:"userStatus"`
... a bunch more fields
}

type User struct {
ID bson.ObjectId `json:"-" bson:"_id"`
LastName string `json:"lastName" bson:"lastName"`
FirstName string `json:"firstName" bson:"firstName"`
Role string `json:"role" bson:"role"`
Tags []string `json:"tags" bson:"tags"`
... (a bunch more fields)
Stats UserStats `json:"stats" bson:"stats"`
}

我想查询它以获得特定的报告,所以我尝试了这个:

func UserNameReport() {
... get mongo session, etc.

// create struct of just the data I want returned
type UserNames struct {
LastName string `json:"lastName" bson:"lastName"`
FirstName string `json:"firstName" bson:"firstName"`
... etc
UserStats Stats `json:"stats" bson:"stats"`
}

projection := bson.M{"lastName":1, "firstName":1, etc}
result := []UserNames{}
err := x.Find({query user collection}).Select(projection).All(&result)
...
}

这行得通 - 我的问题是,如何只包含“统计”结构中的一个字段?换句话说,我基本上希望“投影”是这样的:

projection := bson.M{"lastName":1, ..., "stats.userStatus":1}  <-- stats.userStatus doesn't work
...
err := x.Find({query user collection}).Select(projection).All(&result)

我在结果中得到了整个“Stats”嵌入结构 - 如何从中的子文档中过滤掉一个字段并将其放入结果集中?

谢谢!

最佳答案

它非常适合我,使用 MongoDB 2.6.5

以下代码:

package main

import (
"fmt"
"gopkg.in/mgo.v2"
"gopkg.in/mgo.v2/bson"
"log"
)

type Statistics struct {
Url string
Hits int
}

type Person struct {
Num int
Uuid string
Name string
Stats []Statistics
}

func main() {

// Connect to the database
session, err := mgo.Dial("localhost")
if err != nil {
panic(err)
}
defer session.Close()

// Remove people collection if any
c := session.DB("test").C("people")
c.DropCollection()

// Add some data
err = c.Insert(
&Person{1, "UUID1", "Joe", []Statistics{Statistics{"a", 1}, Statistics{"b", 2}}},
&Person{2, "UUID2", "Jane", []Statistics{Statistics{"c", 3}, Statistics{"d", 4}}},
&Person{3, "UUID3", "Didier", []Statistics{Statistics{"e", 5}, Statistics{"f", 6}}})
if err != nil {
log.Fatal(err)
}

result := []Person{}
err = c.Find(bson.M{"$or": []bson.M{bson.M{"uuid": "UUID3"}, bson.M{"name": "Joe"}}}).Select(bson.M{"num": 1, "name": 1, "stats.hits": 1}).All(&result)
if err != nil {
log.Fatal(err)
}

fmt.Println(result)
}

结果:

[{1  Joe [{ 1} { 2}]} {3  Didier [{ 5} { 6}]}]

...这正是我所期望的。

关于go - 查询具有不同结构的文档以获得结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27728146/

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