2014-12-18 16 views
9

Trong bài đăng this, câu trả lời được chấp nhận giải thích rằng bạn không thể có cùng các trường dưới $set$setOnInsert trong thao tác upsert.

Ai đó có thể giải thích lý do vì sao đây là? Có vẻ như $setOnInsert không nên xung đột với $set, vì tài liệu cũ được sử dụng khi chèn tài liệu và tài liệu sau được sử dụng khi tài liệu được cập nhật.

+5

Thành thực mà nói, tôi không có một lời giải thích cho lý do tại sao đây là trường hợp bây giờ; Tôi cũng muốn thấy điều này được thực hiện. Có một yêu cầu nâng cao, [SERVER-10711] (https://jira.mongodb.org/browse/SERVER-10711), để cho phép '$ set' và' $ setOnInsert' hoạt động trong cùng một bản cập nhật trên cùng một trường . Bạn có thể nhận xét, xem và nêu lên vấn đề đó để nâng cao mức độ ưu tiên của nó. – wdberkeley

+1

cảm ơn bạn đã chỉ ra điều này @wdberkeley. Bạn có biết nếu có một giải pháp cho điều này mà không cần hai truy vấn? – jtmarmon

Trả lời

5

$ set toán tử được sử dụng trên upsert quá. Vì vậy, thật vô nghĩa khi chỉ các trường giống nhau trên cả hai số $ set$ setOnInsert.

Chỉ cần cố gắng này trên một bộ sưu tập trống:

db.items.remove(); 
db.items.update({},{$set:{a:1},$setOnInsert:{b:2}},{upsert:1}) 
db.items.find({}); 
+4

Nó không phải là "vô nghĩa". Ví dụ, tôi cần một trường là 'true' nếu tài liệu vừa được chèn vào, và là' false' nếu nó vừa được cập nhật. Nếu cùng một trường tồn tại trong cả '$ set' (như' false') và '$ setOnInsert' (như' true'), và tài liệu được chèn vào, trường trong '$ setOnInsert' sẽ được ưu tiên ngay cả khi nó tồn tại trong phần '$ set'. – maganap

Các vấn đề liên quan