Rethinkdb - 在多个字段上不等于(ne)

时间:2016-08-12 03:08:47

标签: rethinkdb rethinkdb-javascript

我有一个类似于以下

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

我正在尝试根据“用户”和“反应”的组合删除数组反应中的项目,这将是唯一的。我如何使用js驱动程序过滤反应数组以删除rethinkdb中的特定项?

我试过这个

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)

我理解为什么它不起作用(返回所有没有给出反应的反应,然后返回没有特定用户的那个数组的子集)。 我想要的是那些不等于同步执行的,所以它返回一个不包含具有提供的反应AND用户的项目的数组。现在它的功能更像是反应OR用户。

2 个答案:

答案 0 :(得分:0)

一个伙伴帮助了我。这是一个适合我想要完成的解决方案,但它没有使用不相等的解决方案。如果有人有另一个使用不相等的解决方案请分享。

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)

答案 1 :(得分:0)

如果没有.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)

请注意.difference将从数组中删除该对象的所有实例,因此假设只有单个反应和用户组合的实例。

或者您可以将它与您已经拥有的内容保持一致,并使用不同形式的.and()

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