我有一个类似于以下
的文档{
...
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用户。
答案 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))
})
...