Rethinkdb -多个字段不相等(ne)



我有一个类似于下面的文档

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

我试图删除基于'用户'和'反应'的组合,这将是唯一的数组反应项。我将如何去过滤反应数组,以删除该特定项目在rethinkdb使用js驱动程序?

我试过了

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)

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

一个朋友帮了我。这里有一个解决方案,对我想要完成的事情有效,但它没有利用不相等。如果有人有其他的解决方案,利用不相等,请分享它。

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)

这里有一个可能更简单的方法来做到这一点,没有.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))
                        })
...

最新更新