2016-08-12 2 views
0

Ich habe ein Dokument, das auf die folgendenRethinkdb - Ungleich (ne) auf mehreren Feldern

{ 
    ... 
    reactions: [ 
    { 
     user: 'user_id', 
     reaction: 'reaction_name' 
    }, { 
     user: 'user_id', 
     reaction: 'reaction_name' 
    } 
    ] 
    ... 
} 

ein Element in den Array-Reaktionen zu entfernen Ich versuche, ähnlich aussieht basierte auf einer Kombination von ‚user‘ und "Reaktion", die einzigartig sein wird. Wie würde ich das Filter-Array filtern, um dieses spezielle Element in rethinkdb mit dem js-Treiber zu entfernen?

habe ich versucht, diese

r.db('db_name').table('messages').getAll(
         get_single_message 
        ).update({ 
         reactions: r.row('reactions').filter((item) => { 
          return item('reaction').ne(body.reaction).and(item('user').ne(body.user)) 
         }) 
         }).run(this._rdbConn) 

Ich verstehe, warum es nicht funktioniert (alle Reaktionen zurückgibt, die Reaktion hat nicht gegeben, dann kehrt Teilmenge des Arrays, die nicht bestimmte Benutzer zugeordnet ist) . Was ich möchte, ist für diejenigen, die nicht gleich durchgeführt werden, so dass es ein Array zurückgibt, das keine Elemente enthält, die die angegebene Reaktion UND Benutzer haben. Im Moment funktioniert es eher wie Reaktion ODER Benutzer.

+0

Sie sollten eine von ihnen als eine ausreichende Antwort @ millejo3 markieren verwenden! – dalanmiller

Antwort

0

Ein Kumpel hat mir geholfen. Hier ist eine Lösung, die für das, was ich zu erreichen versucht, funktioniert, aber es nutzt nicht gleich. Wenn jemand eine andere Lösung hat, die nicht gleich verwendet, teilen Sie es bitte mit.

r.db('db_name').table('messages').getAll(
         get_single_message 
        ).update({ 
         reactions: r.row('reactions').filter(function (doc) { 
          return doc('reaction').eq(body.reaction).and(doc('user').eq(body.user)).not() 
         }) 
         }).run(this._rdbConn) 
0

Hier ist eine möglicherweise vereinfachte Art und Weise, dies zu tun, ohne .ne:

r.db('db_name').table('messages').getAll(
         get_single_message 
        ).update({ 
         reactions: r.row('reactions').difference([{ 
          reaction: body.reaction, 
          user: body.user 
         }]) 
         }).run(this._rdbConn) 

nur gewarnt werden, dass .difference alle Instanzen des Objekts aus dem Array entfernen, so setzt dies voraus, dass es nur einzelne Beispiele für einzigartige Kombinationen von Reaktion und Benutzer.

Oder man könnte es eng halten zu dem, was Sie bereits haben und die andere Form von .and()

... 
reactions: r.row('reactions').filter((item) => { 
          return r.and(item('reaction').ne(body.reaction), item('user').ne(body.user)) 
         }) 
... 
Verwandte Themen