2015-05-15 30 views
15

Tôi có một bảng khảo sát trông giống như vậy:RethinkDB - Cập nhật lồng nhau mảng

{ 
    id: Id, 
    date: Date, 
    clients: [{ 
    client_id: Id, 
    contacts: [{ 
     contact_id: Id, 
     score: Number, 
     feedback: String, 
     email: String 
    }] 
    }] 
} 

tôi cần phải cập nhật các lĩnh vực scorefeedback dưới một số liên lạc cụ thể. Hiện nay, tôi đang chạy bản cập nhật như thế này:

function saveScore(obj){ 
    var dfd = q.defer(); 
    var survey = surveys.get(obj.survey_id); 

    survey 
    .pluck({ clients: 'contacts' }) 
    .run() 
    .then(results => { 

     results.clients.forEach((item, outerIndex) => { 
     item.contacts.forEach((item, index, array) => { 
      if(Number(item.contact_id) === Number(obj.contact_id)) { 
      array[index].score = obj.score; 
      console.log(outerIndex, index); 
      } 
     }); 
     }); 

     return survey.update(results).run() 
    }) 
    .then(results => dfd.resolve(results)) 
    .catch(err => dfd.resolve(err)); 

    return dfd.promise; 
}; 

Khi tôi nhìn vào phương pháp update, nó xác định làm thế nào để cập nhật quan trọng lồng nhau: các cặp giá trị. Tuy nhiên, tôi không thể tìm thấy bất kỳ ví dụ nào để cập nhật một mục riêng lẻ trong một mảng.

Có cách nào tốt hơn và hy vọng là sạch hơn để cập nhật các mục trong một mảng lồng nhau không?

Trả lời

10

Bạn có thể cần lấy mảng, filter ra giá trị mong muốn trong mảng và sau đó nối lại nó vào mảng. Sau đó, bạn có thể chuyển mảng đã cập nhật sang phương thức update.

Ví dụ

Hãy nói rằng bạn có một tài liệu với hai khách hàng mà cả hai đều có một namescore và bạn muốn cập nhật điểm số trong một trong số họ:

{ 
    "clients": [ 
    { 
     "name": "jacob" , 
     "score": 200 
    } , 
    { 
     "name": "jorge" , 
     "score": 57 
    } 
    ] , 
    "id": "70589f08-284c-495a-b089-005812ec589f" 
} 

Bạn có thể nhận tài liệu cụ thể đó, chạy lệnh update với hàm đồng nghĩa và sau đó chuyển vào mảng mới, được cập nhật vào thuộc tính clients.

r.table('jacob').get("70589f08-284c-495a-b089-005812ec589f") 
    .update(function (row) { 
    return { 
     // Get all the clients, expect the one we want to update 
     clients: row('clients').filter(function (client) { 
     return client('name').ne('jorge') 
     }) 
     // Append a new client, with the update information 
     .append({ name: 'jorge', score: 57 }) 
    }; 
    }); 

Tôi nghĩ rằng đây là một chút rườm rà và có lẽ một cách thanh lịch hơn đẹp hơn để làm điều này, nhưng điều này nên giải quyết vấn đề của bạn.

Database Schema

Có lẽ nó có giá trị nó để tạo ra một bảng contacts cho tất cả các địa chỉ liên lạc của bạn và sau đó làm một số loại tham gia vào bạn dữ liệu. Sau đó, tài sản contacts của bạn trong clients mảng của bạn sẽ giống như thế:

{ 
    id: Id, 
    date: Date, 
    clients: [{ 
    client_id: Id, 
    contact_scores: { 
     Id: score(Number) 
    }, 
    contact_feedbacks: { 
     Id: feedback(String) 
    } 
    }] 
} 
3

nó làm việc cho tôi

r.table(...).get(...).update({ 
contacts: r.row('Contacts').changeAt(0, 
    r.row('Contacts').nth(0).merge({feedback: "NICE"})) 
}) 
0

CSDL

{ 
    "clients": [ 
    { 
     "name": "jacob" , 
     "score": 200 
    } , 
    { 
     "name": "jorge" , 
     "score": 57 
    } 
    ] , 
    "id": "70589f08-284c-495a-b089-005812ec589f" 
} 

sau đó bạn có thể làm như thế này sử dụng mapbranch truy vấn.

r.db('users').table('participants').get('70589f08-284c-495a-b089-005812ec589f') 
    .update({"clients": r.row('clients').map(function(elem){ 
    return r.branch(
     elem('name').eq("jacob"), 
     elem.merge({ "score": 100 }), 
     elem)}) 
    }) 
Các vấn đề liên quan