2013-04-25 32 views
5

Tôi hiểu thực tế là bạn không thể cập nhật _id trên tài liệu mongodb hiện có.Cập nhật Mongodb. setOnInsert Mod on _id không được phép

Nhưng có lý do nào khiến chúng tôi không thể sử dụng nó trong phần nâng cao trong phần 'setOnInsert' không? Bởi vì nó là 'trên chèn' vì vậy nó không phải là một bản cập nhật.

sử dụng dự kiến ​​của tôi là thế này:

db.myCol.update({_id:12345},{$setOnInsert:{_id:12345},$set:{myValue:'hi'}}); 

Đây có phải là một lỗi hay tôi thiếu cái gì?

+1

lá cờ thăng hoa ở đâu? chỉ cần rời khỏi setOnInsert và điều đúng sẽ xảy ra. db.myCol.update ({_ id: 12345}, {$ set: {myValue: 'hi'}}) –

+1

Vâng, bạn nói đúng tôi quên bao gồm cờ upsert. Dường như nó sẽ tự động bao gồm phần tìm kiếm để chèn nếu đó là một upsert. Cảm ơn :) –

+0

chính xác. bạn có muốn viết nó như là câu trả lời hay tôi nên? –

Trả lời

9

MongoDB sử dụng phần 'truy vấn' cho truy vấn upsert như một phần của tập hợp, có nghĩa là bạn không phải chỉ định _id trong phần thiết lập của bạn muốn chỉ định _id của riêng bạn.

lưu ý: truy vấn của tôi ở trên cũng có lỗi nhỏ là lá cờ upsert bị thiếu.

Đây là truy vấn chính xác:

db.myCol.update({_id:12345},{$set:{myValue:'hi'}},{upsert:true}); 

Nếu hồ sơ không tồn tại, truy vấn này sẽ chèn một kỷ lục mà trông như thế này:

{_id:12345,myValue:'hi'} 
3

Thực sự, đây là một lỗi trong mongo được sửa trong phiên bản phát triển 2.5.4 hoặc bản phát hành 2.6.0:

https://jira.mongodb.org/browse/SERVER-9958

Khi đã được khắc phục, tôi tin rằng điều này sẽ hoạt động như mong muốn. Trong trường hợp chung, truy vấn cập nhật sẽ không nhất thiết phải chỉ định trường "_id".

+0

Nếu đây là lỗi, nó vẫn tồn tại trong 3.4. Tôi đã cố gắng sử dụng $ setOnInsert với {_id}, nhưng nó đã ném Mod trên _id không được phép vào tôi. –

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