2016-09-14 122 views
2

一個OR條件我有一個結構:兩個過濾器與RethinkDB

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

我現在Talk結構是這樣的:

{ 
    "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" 
} 

我如何可以檢索談話,用單查詢,其中:

(UserIdX == talk.UserIdX和UserIdY == talk.UserIdY)OR(UserIdX == talk.UserIdY和UserI DY == talk.UserIdX)

我真正做到這一點像下面這樣:

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 
} 

我怎樣才能得到這個以更簡單的方式工作?

回答

2

我要在這裏召喚@ daniel-cannon,但我認爲這就是您要查找的內容,並且將大大簡化此查詢並將其僅減少爲單個查詢。但是,只有兩個小竅門:

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) 

我希望這有助於!

+1

謝謝@dalanmiller!這看起來應該起作用,有幾個非常小的Go語法錯誤(我提交了一個解決這些問題的編輯),但我認爲它應該回答@Fantasim的問題。 –

+0

我以前見過or和和功能,但我沒有意識到它的工作原理,非常感謝! – Fantasim