2012-11-03 33 views
5

Lệnh upsert sẽ được triển khai trong Meteor trong bao lâu?Meteor upsert tương đương

Và cách tốt nhất để làm điều tương tự trong thời gian đó là gì?

Something như thế này là những gì tôi đang làm vào lúc này:

if typeof (item = Items.findOne({title:'Foo'})) == 'undefined' 
    item = Items.insert({title:'Foo'}) 
else 
    Items.update(item._id, {$set: {title:'Foo'}}) 
# do something with item 
+2

Với giải pháp của bạn, lưu ý rằng nếu hai khách hàng riêng biệt thực hiện findOne() cùng một lúc, sau đó hai tài liệu với '{title: 'Foo'}' sẽ được tạo ra. –

+0

True, sau đó thực hiện meteor của upsert sẽ là lý tưởng. Vì nếu hai khách hàng chạy upsert với cùng một dữ liệu, họ tạo các tài liệu riêng lẻ trên máy khách mô phỏng db của họ; sau đó sao băng sẽ đồng bộ hóa hai tài liệu khi chúng chạy trên máy chủ. Nó có thể có một chút lông, mặc dù ... Tôi có thể thấy lý do tại sao nó không được thực hiện được nêu ra. – tom

Trả lời

5

lệnh upsert sẽ được thực hiện như thế nào sớm trong Meteor?

UPDATE: @Thomas4019 points out upsert mà bây giờ được hỗ trợ:

v0.6.6

"Thêm hỗ trợ upsert Collection.update bây giờ hỗ trợ {upsert: true}.. Tùy chọn Ngoài ra, thêm một Phương thức Collection.upsert trả về id đối tượng mới được chèn nếu có. "

Nguồn: History.md

tài liệu hướng dẫn sử dụng: http://docs.meteor.com/#upsert

- câu trả lời ban đầu sau -

Có một thẻ trên Trello Meteor Lộ trình mà bạn có thể bỏ phiếu để chỉ ra tầm quan trọng của nó đối với bạn : https://trello.com/c/C91INHmj

Hiện tại, danh sách này nằm trong danh sách "Sau" có nghĩa là sẽ mất một lúc trước khi danh sách được triển khai trừ khi nhận được nhiều phiếu bầu.

Điều quan trọng khác cần lưu ý là vì thiên thạch là nguồn mở, bạn có thể tự mình thực hiện các thay đổi cần thiết và gửi lại.


cách tốt nhất để làm điều tương tự trong thời gian trung bình là bao nhiêu?

Có một số giải pháp nhưng phù hợp nhất cho trường hợp sử dụng của bạn là không thể nói mà không có nhiều kiến ​​thức về thiết kế của bạn.

  1. Sử dụng mã như là, thêm một chỉ số duy nhất cho các bộ sưu tập, và xử lý các lỗi khóa trùng lặp nếu/khi nó phát sinh

  2. Thay đổi thiết kế để thực hiện đồng thời lạc quan rõ ràng.

Cốt lõi của cả hai giải pháp này đều giống nhau, xử lý một cách duyên dáng trường hợp lỗi. # 1 dễ thực hiện hơn. # 2 cho phép linh hoạt hơn trong cách xử lý đồng thời lạc quan.

+1

Chức năng Upsert hiện được tích hợp sẵn. – Thomas4019

0

Nếu bạn thực sự muốn làm điều đó, bạn có thể sử dụng kết nối mongodb trực tiếp: MongoInternals.defaultRemoteCollectionDriver().mongo.db.collection('myCollection').update(query, update, {upsert: true}). Tất nhiên kết nối này không được ghi chép nên có khả năng nó có thể thay đổi trong tương lai.

0

Upsert thực sự dễ dàng với mẹo này.bạn chỉ cần kiểm tra nếu nó có một đặc tính _id:

if(item._id){ 
    //update 
}else{ 
    //insert 
}