如何将序列合并到一个嵌入数组中并忽略具有相同值的elems与特定字段中的嵌入数组元素?

时间:2014-09-30 10:51:07

标签: rethinkdb

我有这样的文档:

{
   "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"))
        })
     })
   )}
)})

2 个答案:

答案 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()
     })
   )}
)})