如何在golang中使用$unwind?
How to use $unwind in golang?
我想要 mongo shell 提供的结果。
在mongoshell中数据是这样的:
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")
}
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))
}
结果是这样的:
[{"_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 提供的结果。
因为映射无效,在 $user
上的 $unwind
之后,您应该期望每个结果只包含一个用户,因此,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"`
}
并保持原来的状态 type
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
我想要 mongo shell 提供的结果。
在mongoshell中数据是这样的:
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")
}
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))
}
结果是这样的:
[{"_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 提供的结果。
因为映射无效,在 $user
上的 $unwind
之后,您应该期望每个结果只包含一个用户,因此,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"`
}
并保持原来的状态 type
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