我有这样的文档:
{
"shareRecords": [
{"sharer_Id": "user001","update_Id": "update002"}
{"sharer_Id": "user001","update_Id": "update003"}
]
"id": "0"
}
并希望合并一个序列以按规则嵌入数组“ShareRecords”:如果elem具有相同的“update_Id”值,请忽略它,例如,如果我尝试合并此序列:
[
{"sharer_Id": "user001","update_Id": "update002"}
{"sharer_Id": "user001","update_Id": "update004"}
]
由于elem具有相同的“update_Id”值,因此应忽略第一个元素:“update002”已经存在。
我尝试了这个,但似乎等于追加,没有执行任何过滤,所有新记录都直接附加到“shareRecords”,这里有什么错误?
r.table("table").get("0").update(function(doc) {
return doc.merge({shareRecords: doc("shareRecords").add(
r.expr([{"update_Id":"update002"},{"update_Id":"update004"}]).filter(
function(newRecord) {
return doc("shareRecords").contains(function(record) {
return record("update_Id").ne(newRecord("update_Id"))
})
})
)}
)})
答案 0 :(得分:0)
如果先前未在嵌入式阵列中插入新记录,则会插入新记录。所以它与你想要的有点不同
var newShareRecords = [
{"sharer_Id": "user001","update_Id": "update002"}
{"sharer_Id": "user001","update_Id": "update004"}
]
r.table("data").merge(function(doc) {
return {
shareRecords: doc("shareRecords").setIntersection(newShareRecords)
}
})
如果您真的只想检查update_id
,可以
r.table("data").merge(function(doc) {
return {
shareRecords: doc("shareRecords").add(
r.expr(newShareRecords).filter( function(newRecord) {
return doc("shareRecords").contains(function(record) {
return record("update_id").eq(newRecord("update_id")
})
})
)
}
})
答案 1 :(得分:0)
正确的代码应该是:
r.table("table").get("0").update(function(doc) {
return doc.merge({shareRecords: doc("shareRecords").add(
r.expr([{"update_Id":"update002"},{"update_Id":"update004"}]).filter(
function(newRecord) {
return doc("shareRecords").contains(
function(record) {
return record("update_Id").eq(newRecord("update_Id"))
}).not()
})
)}
)})