如何在MongoDB中使用搜索执行Joinquery并转到?

时间:2017-09-20 05:30:45

标签: mongodb go

大家好,

我正在开展一个客户可以发送帐户停用请求的项目,作为管理员,我可以看到列表并在页面上停用它们,在同一页面上,我有一个搜索过滤器,按名称,电子邮件和电话号码进行过滤。我有一个集合来容纳客户和另一个集合来保存停用请求。我已经完成了列表部分作为其简单的选择查询但面临问题通过搜索过滤器获取列表,我在Go lang中有以下两个结构来获取记录:


 type DeactivationRequest struct {
        Id                          int         `json:"id" bson:"id"`
        Uid                         int         `json:"uid" bson:"uid"`
        RequestTime                 int64       `json:"request_time" bson:"request_time"`
        Status                      int         `json:"status" bson:"status"`
        Note                        string      `json:"note" bson:"note"`
    }

    type User struct {
        Id                         int         `json:"id" bson:"_id,omitempty"`
        FirstName                  string      `json:"first_name,omitempty" bson:"first_name,omitempty"`
        LastName                   string      `json:"last_name,omitempty" bson:"last_name,omitempty"`
        EmailId                    string      `json:"email_id,omitempty" bson:"email_id,omitempty"`
        Password                   string      `json:"password,omitempty" bson:"password,omitempty"`
        PhoneNumber                string      `json:"phone_number,omitempty" bson:"phone_number,omitempty"`
        AltPhoneNumber             string      `json:"alt_phone_number,omitempty" bson:"alt_phone_number,omitempty"`
        Status                     int         `json:"status" bson:"status"`
        Role                       string      `json:"role,omitempty" bson:"role,omitempty"`
    }

我遇到连接查询问题,无法根据我编写的搜索关键字获取记录。


    result := []bson.M{}
        skip := 0
        limit := 20
        c := mongoSession.DB("database").C("deactivation_requests")
        pipe := c.Pipe([]bson.M{bson.M{"$match": bson.M{ "status" : 0 }},
                                bson.M{"$lookup": bson.M{
                                                    "localField"    : "_id",
                                                    "from"          : "users",
                                                    "foreignField"  : "uid",
                                                    "as"            : "profile"}},
                                bson.M{"$unwind": "$profile"},
                                bson.M{"$skip": skip},
                                bson.M{"$limit": limit},})
        err = pipe.All(&result)
        if err != nil {
            return result, err
        }

结果的预期格式如下:

这样做的最佳方式是什么?

提前致谢。

<table>
        <tr>
            <th>Name</th>
            <th>Email</th>
            <th>Phone Number</th>
            <th>Note</th>
        </tr>
        <tr>
            <td>Swati Sharma</td>
            <td>swati@swatii.com</td>
            <td>987-999-9999</td>
            <td>I don't want my acount</td>
        </tr>
        <tr>
            <td>James Black</td>
            <td>james@jamess.com</td>
            <td>999-999-3120</td>
            <td>I don't want my acount</td>
        </tr>
    </table>

1 个答案:

答案 0 :(得分:0)

您好

我找到了查询的答案。我尝试了以下代码,它适用于我。


    result := []bson.M{}
            skip := 0
            limit := 20
            c := mongoSession.DB("database").C("deactivation_requests")
            pipe := c.Pipe([]bson.M{
                                    bson.M{"$lookup": bson.M{
                                                        "localField"    : "_id",
                                                        "from"          : "users",
                                                        "foreignField"  : "uid",
                                                        "as"            : "profile"}},
                                    bson.M{"$unwind": "$profile"},
                                    bson.M{"$match": bson.M{"$or": []bson.M{ 
                                                        bson.M{"profile.first_name":bson.RegEx{"(?i).*"+name+".*", "i"} },
                                                        bson.M{"profile.last_name": bson.RegEx{ "(?i).*"+name+".*", "i"} }, 
                                                        bson.M{"profile.email_id": bson.RegEx{"(?i).*"+name+".*", "i"} }, 
                                                        bson.M{"profile.phone_number": bson.RegEx{".*"+keyword+".*", "i"} }, 
                                                        bson.M{"profile.alt_phone_number": bson.RegEx{".*"+keyword+".*", "i"} }, 
                                    }}},
                                    bson.M{"$skip": skip},
                                    bson.M{"$limit": limit},})
            err = pipe.All(&result)
            if err != nil {
                return result, err
            }