Mongodb 在golang如何使用$REWIND?

Mongodb 在golang如何使用$REWIND?,mongodb,go,mgo,Mongodb,Go,Mgo,我想要的结果在围棋作为蒙戈外壳提供给我 在mongo shell中,数据如下所示: db.user.aggregate([{$unwind:"$user"}]).pretty() { "_id" : ObjectId("57307906f051147d5317984e"), "user" : { "firstName" : "chetan", "lastName" : "kumar", "age" : 23 },

我想要的结果在围棋作为蒙戈外壳提供给我

在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
        }
    ]
}
 [{"_id":"57307906f051147d5317984e",
"user":null,
"sales":[{
"firstName":"ashu","lastName":"jha","age":27}]},{"_id":"57307906f051147d5317984e",
"user":null,
"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")
        }
        defer session.Close()


        session.SetMode(mgo.Monotonic, true)

        c := session.DB("userdb").C("user")


       var result []Details


    o1 := bson.M{
        "$unwind":"$user",
    }


        operations := []bson.M{o1}
    pipe := c.Pipe(operations)
    err = pipe.All(&result)
        if err != nil {
                log.Fatal(err)
        }
        res1B, _ := json.Marshal(result)
        fmt.Fprintf(w,string(res1B))
}

func main(){
    router := mux.NewRouter().StrictSlash(true)
    router.HandleFunc("/detail",detail)
    log.Fatal(http.ListenAndServe(":9080", router))

}
结果如下:

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
        }
    ]
}
 [{"_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提供的reult。

因为映射无效,在
$user
$unwind
之后,您应该期望每个结果只包含一个用户,因此,
user
不应该是
数组

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"`
}
并保留您原来的
类型

type 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

由于映射无效,在
$user
上的
$unwind
之后,您应该期望每个结果只包含一个用户,因此,
user
不应该是
数组

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"`
}
并保留您原来的
类型

type 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

我的json文件类似于{“u id”:ObjectId(“57307906f051147d5317984e”),“user”:[{“firstName”:“chetan”,“lastName”:“kumar”,“age”:23},{“firstName”:“nepolean”,“lastName”:“dang”,“age”:26}],“sales”:[{“firstName”:“ashu”,“lastName”:“jha”,“age”:27}]是的,您有一个用户列表,但问题是,
$unwind
将修改行为(从
数组
到单个
元素
)。另一个建议是为
$unwind
版本的响应创建另一个
类型
。但是如果我想在数组中使用,那该怎么办呢?你可以为
$unwind
创建另一个类型,让我更新我的答案。我的json文件类似于{“id”:ObjectId(“57307906f051147d5317984e”),“user:[{“firstName:“chetan”,“lastName”:“kumar”,“age”:23},{“firstName”:“nepolean”,“lastName”:“dang”,“age”:26}],“sales”:[{“firstName”:“ashu”,“lastName”:“jha”,“age”:27}}}是的,您有一个用户列表,但问题是
$unwind
将修改行为(从
数组
到单个
元素
)。另一个建议是为
$unwind
版本的响应创建另一个
类型
。但是如果我想在数组中使用,该怎么办?您可以为
$unwind
创建另一个类型,请让我更新我的答案。