0

我有一个类似于以下内容的文档

{
  ...
  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)

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

4

2 回答 2

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))
                        })
...
于 2016-08-12T22:20:08.237 回答
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)
于 2016-08-12T18:24:52.227 回答