2010-09-15 48 views
11

Trong vỏ MongoDB, nếu tôi làm như sau, sau đó một chỉ số được tạo ra, và cũng có thể ngăn chặn hồ sơ trùng lặp khỏi bị chèn vào:Tại sao MongoDB có thể tạo chỉ mục duy nhất nhưng Mongoid không thể?

db.analytics.ensureIndex({page: 1, some_id: 1, ga_date: -1}, {unique: true}); 

Nhưng tôi nghĩ Mongoid thể làm tương tự: http://mongoid.org/docs/indexing/

Vì vậy, tôi có:

class PageAnalytic < Analytic 
    include Mongoid::Document 
    field :page, :type => String 
    field :some_id, :type => Integer 
    field :ga_date, :type => Time 
    field :pageviews, :type => Integer 
    field :timeOnPage, :type => Integer 
    index(
    [ 
     [ :page, Mongo::ASCENDING ], 
     [ :some_id, Mongo::ASCENDING ], 
     [ :ga_date, Mongo::DESCENDING ] 
    ], 
    :unique => true 
) 
end 

và làm một

rake db:create_indexes 

nhưng vẫn có thể chèn bản ghi trùng lặp?

Cập nhật: nó khá lạ, nhưng sau khi tôi thêm chỉ mục trong trình MongoDB và thả bộ sưu tập, và sau đó tạo lại chỉ mục trong MongoDB Shell hoặc Mongoid, bây giờ tôi có thể thả bộ sưu tập trong MongoDB shell và sau đó cào tạo chỉ mục và sử dụng mongoid để thêm cùng một tài liệu hai lần và mongod sẽ báo lỗi cho khóa trùng lặp.

+0

bạn đang sử dụng phiên bản mongoid nào? –

Trả lời

7

Bạn có sử dụng cách thông thường để lưu mô hình của mình không? Giống như:

page_analyitc.save

Nếu bạn sử dụng cách này để lưu mô hình, mongoid sẽ không đưa ra bất cứ thông báo lỗi (nếu có có một chìa khóa trùng lặp trên MongoDB)

Vì vậy, cách chính xác để làm điều này. đang sử dụng:

page_analyitc.safely.save

Nó sẽ nâng cao một lỗi như:

Mongo :: OperationFailure: 11001: E11001 khóa trùng lặp về cập nhật

Hope những thông tin có thể giúp bạn.

0

Khi bạn thêm index vào tài liệu của mình, mongoid sẽ không tự động tạo bất kỳ chỉ mục nào. Để tạo chỉ mục, bạn cần chạy tác vụ rake rake db:mongoid:create_indexes như bạn có thể thấy trong tài liệu mới http://mongoid.org/en/mongoid/docs/indexing.html.

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