猿问

如何在 golang 中使用 $unwind?

我想要结果,因为 mongo shell 提供给我。


在 mongo shell 中,数据是这样的:


db.user.aggregate([{$unwind:"$user"}]).pretty()    

{

    "_id" : ObjectId("57307906f051147d5317984e"),

    "user" : {

        "firstName" : "chetan",

        "lastName" : "kumar",

        "age" : 23

    },

    "sales" : [

        {

            "firstName" : "ashu",

            "lastName" : "jha",

            "age" : 27

        }

    ]

}

{

    "_id" : ObjectId("57307906f051147d5317984e"),

    "user" : {

        "firstName" : "nepolean",

        "lastName" : "dang",

        "age" : 26

    },

    "sales" : [

        {

            "firstName" : "ashu",

            "lastName" : "jha",

            "age" : 27

        }

    ]

}

但是在去


package main    

import(

    "fmt"

    "log"

    "net/http"

        "encoding/json"

    "github.com/gorilla/mux"

        "gopkg.in/mgo.v2"

        "gopkg.in/mgo.v2/bson"

)

type User struct{

    FIRSTNAME   string      `json:"firstName" bson:"firstName"`

    LASTNAME    string      `json:"lastName" bson:"lastName"`

    AGE     int     `json:"age" bson:"age"`

}

type Sales struct{

    FIRSTNAME   string      `json:"firstName" bson:"firstName"`

    LASTNAME    string      `json:"lastName" bson:"lastName"`

    AGE     int     `json:"age" bson:"age"`

}


type Details struct{

    ID  bson.ObjectId   `json:"_id" bson:"_id"`

    USER    []User      `json:"user" bson:"user"`

    SALES   []Sales     `json:"sales" bson:"sales"`

}


func detail(w http.ResponseWriter, r *http.Request){

    session, err := mgo.Dial("127.0.0.1")

        if err != nil {

                panic(err)

        }else{

                fmt.Println("dial")

        }


结果是这样的:


 [{"_id":"57307906f051147d5317984e",

"user":null,

"sales":[{

"firstName":"ashu","lastName":"jha","age":27}]},{"_id":"57307906f051147d5317984e",

"user":null,

"sales":[{

"firstName":"ashu","lastName":"jha","age":27}]}]        

但它表明"user": null,我希望得到 mongo shell 提供的结果。


拉丁的传说
浏览 185回答 1
1回答

海绵宝宝撒

因为映射是无效的,在$unwindon之后$user,你应该期望每个结果只包含一个用户,因此,User不应该是array.type Details struct{    ID  bson.ObjectId   `json:"_id" bson:"_id"`    USER    []User      `json:"user" bson:"user"`    SALES   []Sales     `json:"sales" bson:"sales"`}应改为:type Details struct{    ID  bson.ObjectId   `json:"_id" bson:"_id"`    USER    User      `json:"user" bson:"user"`    SALES   []Sales     `json:"sales" bson:"sales"`}由于您可能需要两种类型的响应,一种是正常响应,另一种$unwind是当前响应,您可以为其创建另一种类型:type UnwindDetails struct{    ID  bson.ObjectId   `json:"_id" bson:"_id"`    USER    User      `json:"user" bson:"user"`    SALES   []Sales     `json:"sales" bson:"sales"`}保持你原来的样子 typetype Details struct{    ID  bson.ObjectId   `json:"_id" bson:"_id"`    USER    []User      `json:"user" bson:"user"`    SALES   []Sales     `json:"sales" bson:"sales"`}因此,您必须将result变量的类型修改为:var result []UnwindDetails
随时随地看视频慕课网APP

相关分类

Go
我要回答