Rethinkdb追加到数组如果存在
Rethinkdb append to array if exists
在RethinkDB中,我有一个表authors
,具有以下布局:
{
id: 12,
videos: [1,2,3]
}
现在我用这样的对象得到新的作者:
{
id: 12,
videos: [4,5]
}
如果作者现在已经存在,我想将新的视频4
和5
添加到视频列表中。如果author不存在,就按原样插入文档。我的方法是这样的,但它不起作用。
r.table('authors').getAll(4, 3, 2, 1, {index: 'id'})
.replace(function(author, index) {
return r.branch(
author.eq(null),
{
id: index,
videos: [1,2,3]
},
author
);
})
->反应:
{
"deleted": 0 ,
"errors": 3 ,
"first_error": "Expected 2 arguments but found 1." ,
"inserted": 0 ,
"replaced": 0 ,
"skipped": 0 ,
"unchanged": 0
}
谢谢!
你的逻辑很好。这只是一些语法问题。
给定一个作者,如果作者不存在,插入它,否则,附加视频数组,这是我的想法,使用你的逻辑:
var author = {
id: 12,
videos: [9, 10]
};
r.table('authors').insert(author).do(
function (doc) {
return r.branch(doc('inserted').ne(0),
r.expr({inserted: 1}),
r.table('authors').get(author["id"]).update(function(doc) {
return {videos: doc('videos').union(author["videos"])}
})
)
}
)
如果插入成功,则意味着我们没有具有相同id
的文档,我们不必做任何事情。否则,我们将更新文档并将视频附加到其中。
要更新包含多个作者的数组,可以使用foreach
和expr
将数组转换为ReQL对象。但是,在本例中,我们使用bracket
来获取字段,而不是像JavaScript对象
[]
。var authors = [{
id: 12,
videos: [90, 91]
},{
id: 14,
videos: [1, 2]
}];
r.expr(authors).forEach(function(author) {
return r.table('authors').insert(author).do(
function (doc) {
return r.branch(doc('inserted').ne(0),
r.expr({inserted: 1}),
r.table('authors').get(author("id")).update(function(doc) {
return {videos: doc('videos').union(author("videos"))}
})
)
}
)
})
应该这样做:
r([4, 3, 2, 1]).foreach(function(id) {
return r.table('authors').get(id).replace(function(row) {
return r.branch(row.eq(null), {id: id, videos: [1, 2, 3]}, row);
});
});
lambda for replace方法只有一个参数。但是你试图传递2个参数:author
, index
.
相关文章:
- 一个密码测试程序,如果存在空格,它会提醒用户
- 从一个数组中移除字符串(如果存在于另一个数组)
- underline-js:将键对象与数组键对象进行比较,如果存在,则移除现有的添加新的
- 如果存在特定类,请不要添加类
- Shopify Liquid:如果存在价格比较,如何仅显示产品变体的价格比较
- 仅JavaScript-删除某些类(如果存在)
- jQuery脚本,它搜索现有的查询参数并且不添加“"如果存在
- jQuery-检查外部页面上是否存在DIV,如果存在,则加载DIV,否则加载另一个
- 如果存在event.preventDefault函数,则ajaxForm不起作用
- 如果存在Javascript,请删除多个类中的一个
- JavaScript:仅按字符或按字符+数字(如果存在)拆分字符串
- 如果存在Cookie,则JavaScript重定向
- 如果存在cookie,则自动执行Javascript
- Internet Explorer CSS类样式没有'如果存在具有相同类名的其他元素,则不适用
- 如果存在空单元格,DataTables将发出警告
- 如果存在跨度,则将类添加到链接
- Node.js Express应用程序:如果存在cookie,则从服务器端向元素添加CSS类
- jQuery按钮显示/隐藏类,如果存在类
- JQuery:如果存在具有相同 ID 的元素,则选择第二个元素
- 如果存在多个现有值,则向文本区域值添加分隔符 (Javascript)