duanluangua8850 2016-09-14 20:04
浏览 79
已采纳

RethinkDB上两个带有OR条件的过滤器

I've a struct :

type Talk struct {
    Id string `gorethink:"id,omitempty"`
    MatchId string
    UserIdX string
    UserIdY string
    UserNameX string
    UserNameY string
    CreatedAt time.Time
}

My current Talk struct looks like this:

{
    "CreatedAt": Wed Sep 14 2016 21:36:26 GMT+02:00 ,
    "MatchId":  "172d51fa-438b-49a5-bbe5-422377f09336" ,
    "UserIdX":  "acc4e0b6-d33b-4755-9c0a-ae5309c2ba75" ,
    "UserIdY":  "03f76d8b-ed6a-4c0f-9cde-27b17c9e7cdb" ,
    "UserNameX":  "Barbara" ,
    "UserNameY":  "Louis" ,
    "id":  "ead3f1b0-b242-4c6d-8027-a59572b58649"
}

How can I retrieve a talk, with a single query, where:

(UserIdX == talk.UserIdX AND UserIdY == talk.UserIdY) OR (UserIdX == talk.UserIdY AND UserIdY == talk.UserIdX)

I actually do it like the following:

func (talk *Talk) GetTalkByUsersId() bool {
    talk1 := new(Talk)
    talk2 := new(Talk)

    curs, _ :=  r.Table("Talks").
                Filter(r.Row.Field("UserIdX").Eq(talk.UserIdX)).
                Filter(r.Row.Field("UserIdY").Eq(talk.UserIdY)).
                Run(api.Sess)

    curs2, _ :=  r.Table("Talks").
                Filter(r.Row.Field("UserIdX").Eq(talk.UserIdY)).
                Filter(r.Row.Field("UserIdY").Eq(talk.UserIdX)).
                Run(api.Sess)

    curs.One(&talk1)
    curs2.One(&talk2)
    if talk1.Id == "" && talk2.Id == "" {
        return false
    }
    if talk1.Id != "" {
        talk.copyTalk(talk1)
    } else {
        talk.copyTalk(talk2)
    }
    return true
}

How can I get this to work in a much simpler way?

  • 写回答

1条回答 默认 最新

  • doujie7346 2016-09-15 18:20
    关注

    I'm going to summon @daniel-cannon here but I think this is what you're looking for and will vastly simplify this query and reduce it to just a single query. But just two tips:

    r.Table("talks").Filter(func(talk r.Term) r.Term {
        return r.Or(
            r.And(talk.Field("UserIdX").Eq(UserIdX), talk.Field("UserIdX").Eq(UserIdY)),
            r.And(talk.Field("UserIdY").Eq(UserIdX), talk.Field("UserIdX").Eq(UserIdY)),
        )
    }).Run(api.Sess)
    

    I hope this helps!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥30 软件自定义无线电该怎样使用
  • ¥15 R语言mediation包做中介分析,直接效应和间接效应都很小,为什么?
  • ¥15 Jenkins+k8s部署slave节点offline
  • ¥15 如何实现从tello无人机上获取实时传输的视频流,然后将获取的视频通过yolov5进行检测
  • ¥15 WPF使用Canvas绘制矢量图问题
  • ¥15 用三极管设计一个单管共射放大电路
  • ¥15 孟德尔随机化r语言运行问题
  • ¥15 pyinstaller编译的时候出现No module named 'imp'
  • ¥15 nirs_kit中打码怎么看(打码文件是csv格式)
  • ¥15 怎么把多于硬盘空间放到根目录下