Sự khác biệt giữa tập hợp với {merge: true} và cập nhật


115

Trong Cloud Firestore, có ba thao tác ghi:

1) thêm

2 bộ

3) cập nhật

Trong tài liệu, nó nói rằng việc sử dụng set(object, {merge: true})sẽ hợp nhất đối tượng với đối tượng hiện có.

Điều tương tự cũng xảy ra khi bạn sử dụng update(object) Vì vậy, sự khác biệt nếu có là gì? Có vẻ lạ là google sẽ trùng lặp logic.

Câu trả lời:


263

Cách tôi hiểu sự khác biệt:

  • setmà không có mergesẽ ghi đè lên tài liệu hoặc tạo nó nếu nó chưa tồn tại

  • setwith mergewill cập nhật các trường trong tài liệu hoặc tạo nó nếu nó không tồn tại

  • update sẽ cập nhật các trường nhưng sẽ không thành công nếu tài liệu không tồn tại

  • create sẽ tạo tài liệu nhưng không thành công nếu tài liệu đã tồn tại

Ngoài ra còn có sự khác biệt về loại dữ liệu bạn cung cấp setupdate.

setbạn luôn phải cung cấp dữ liệu dạng tài liệu:

set(
  {a: {b: {c: true}}},
  {merge: true}
)

Với updatebạn cũng có thể sử dụng các đường dẫn trường để cập nhật các giá trị lồng nhau:

update({
  'a.b.c': true
})

1
nhưng bạn đã tìm thấy createphương pháp nào trong API?
ZuzEL

2
cloud.google.com/nodejs/docs/reference/firestore/0.8.x/… cho node.js. Có vẻ như API web không có phương pháp đó. Không chắc chắn mà nền tảng bạn đang ở trên :)
Scarygami

10
Một sự khác biệt khác mà bạn có thể đề cập là sethoạt động trên dữ liệu dạng tài liệu, nơi updatelấy các cặp giá trị và đường dẫn trường. Điều này có nghĩa là bạn có thể thực hiện các thay đổi đối với các giá trị được lồng sâu với các giá trị updatecồng kềnh hơn set. Ví dụ: set({a: {b: {c: true}}}, {merge: true})vs update('a.b.c', true).
Gil Gilbert

Nếu tôi muốn cập nhật một giá trị trong tài liệu, Tôi muốn cập nhật các tài liệu đã tồn tại, vì vậy tôi nghĩ set + mergeall không hữu ích vì nó sẽ tạo ra nó mà tài liệu không tồn tại
John Balvin Arias

Nếu dữ liệu bạn cung cấp cho lệnh set có một trường là null, nó sẽ đặt trường là null nếu nó đã có trong cơ sở dữ liệu hay sẽ để nó một mình?
user1023110

71

Một sự khác biệt khác (mở rộng câu trả lời của Scarygami) giữa "set with merge" và "update", là khi làm việc với các giá trị lồng nhau.

nếu bạn có một tài liệu có cấu trúc như thế này:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
   }
 }

và muốn thêm {"friend-uid-3" : true}

Sử dụng cái này:

db.collection('users').doc('random-id').set({ "friends": { "friend-uid-3": true } },{merge:true})

sẽ dẫn đến dữ liệu này:

 {
   "friends": {
     "friend-uid-1": true,
     "friend-uid-2": true,
     "friend-uid-3": true
   }
 }

tuy nhiên updatebằng cách sử dụng này:

db.collection('users').doc('random-id').update({ "friends": { "friend-uid-3": true } })

sẽ dẫn đến dữ liệu này:

 `{
   "friends": {
     "friend-uid-3": true
   }
 }`

1
Bạn đã thử tự mình kiểm tra điều này chưa? Có một phần trong tài liệu: "Để cập nhật một số lĩnh vực của một tài liệu mà không ghi đè lên toàn bộ tài liệu, sử dụng phương thức update () ..." liên kết
Finlay Percy

2
Tôi đã hiểu rồi. Tôi chỉ thử điều này với một mảng trước đây. Nơi tôi muốn thêm một đối tượng vào mảng và mọi thứ đã được ghi đè cho mảng đó. Nó không hoạt động với các trường có chứa một mảng ... nó không chịu được.
ravo10

1
Chỉ có kết luận tương tự sau khi kiểm tra. Tôi hy vọng họ sẽ thêm một tùy chọn có tác dụng tương tự như { merge: true }chức năng cập nhật.
Johnride

1
Cảm ơn câu trả lời này! Các ví dụ, mặc dù đơn giản, làm cho nó rõ ràng hơn câu trả lời được chấp nhận, cái nào tốt hơn cho usecase của tôi.
ngây thơ

2
Để tránh ghi đè dữ liệu trong các trường lồng nhau (như trong câu trả lời ở trên) khi sử dụng update, bạn có thể sử dụng ký hiệu dấu chấm . Hành vi ghi đè của updatesẽ khác nếu bạn sử dụng / không sử dụng ký hiệu dấu chấm.
Tedskovsky

7

Theo tài liệu: https://firebase.google.com/docs/firestore/manage-data/add-data#update_fields_in_nested_objects

Ký hiệu dấu chấm cho phép bạn cập nhật một trường lồng nhau mà không ghi đè lên trường lồng nhau khác. Nếu bạn cập nhật một trường lồng nhau mà không có ký hiệu dấu chấm, bạn sẽ ghi đè lên toàn bộ trường bản đồ.

Như đã nêu ở trên, điều này thay thế toàn bộ cấu trúc bạn bè.

db.collection('users').doc('random-id').update({
    "friends": {
        "friend-uid-3": true
    }
})

Điều này không.

db.collection('users').doc('random-id').update({
    "friends.friend-uid-3": true
})
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.