我有一个类似于下面的文档
{
...
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))
})
...